]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/depcache.cc
Fixed --no-download
[apt.git] / apt-pkg / depcache.cc
index 9535a79f160119f2e88d43056ddecbf57aa60358..707cb93cd10b5c8aa5cf38f056f737bc102f7055 100644 (file)
@@ -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.21 1999/10/22 05:58:54 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)
@@ -223,8 +216,9 @@ void pkgDepCache::AddSizes(const PkgIterator &Pkg,long Mult)
    }
    
    // Upgrading
-   if (Pkg->CurrentVer != 0 && P.InstallVer != (Version *)Pkg.CurrentVer() &&
-       P.InstallVer != 0)
+   if (Pkg->CurrentVer != 0 && 
+       (P.InstallVer != (Version *)Pkg.CurrentVer() || 
+       (P.iFlags & ReInstall) == ReInstall) && P.InstallVer != 0)
    {
       iUsrSize += Mult*((signed)P.InstVerIter(*this)->InstalledSize - 
                        (signed)Pkg.CurrentVer()->InstalledSize);
@@ -271,6 +265,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;
@@ -278,9 +276,13 @@ void pkgDepCache::AddStates(const PkgIterator &Pkg,int Add)
    
    // Installed, no upgrade
    if (State.Upgradable() == false)
-   {
+   {    
       if (State.Mode == ModeDelete)
         iDelCount += Add;
+      else
+        if ((State.iFlags & ReInstall) == ReInstall)
+           iInstCount += Add;
+      
       return;
    }
    
@@ -511,9 +513,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 +529,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 +572,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 +580,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 +595,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;
 
@@ -692,7 +708,24 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst)
    }
 }
                                                                        /*}}}*/
-
+// DepCache::SetReInstall - Set the reinstallation flag                        /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
+{
+   RemoveSizes(Pkg);
+   RemoveStates(Pkg);
+   
+   StateCache &P = PkgState[Pkg->ID];
+   if (To == true)
+      P.iFlags |= ReInstall;
+   else
+      P.iFlags &= ~ReInstall;
+   
+   AddStates(Pkg);
+   AddSizes(Pkg);
+}
+                                                                       /*}}}*/
 // StateCache::Update - Compute the various static display things      /*{{{*/
 // ---------------------------------------------------------------------
 /* This is called whenever the Candidate version changes. */