]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/depcache.cc
* invert the auto-mark flag only for new installs (in MarkInstall()), keep it as...
[apt.git] / apt-pkg / depcache.cc
index 54cfcb8bb64f79dcea823e4e8cfc4aeb6121b83a..4c52c6c719aa843d863dd2fc6a26b80557c5c234 100644 (file)
@@ -20,6 +20,8 @@
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/tagfile.h>
+
+#include <iostream>
 #include <sstream>    
 #include <apti18n.h>    
                                                                        /*}}}*/
@@ -76,9 +78,6 @@ bool pkgDepCache::Init(OpProgress *Prog)
       // Find the proper cache slot
       StateCache &State = PkgState[I->ID];
       State.iFlags = 0;
-      State.DirtyState = pkgCache::State::RemoveUnknown;
-      //State.AutomaticRemove = I->AutomaticRemove;
-      State.AutomaticRemove = pkgCache::State::RemoveUnknown;
 
       // Figure out the install version
       State.CandidateVer = GetCandidateVer(I);
@@ -113,8 +112,9 @@ bool pkgDepCache::readStateFile(OpProgress *Prog)
    if(FileExists(state)) {
       state_file.Open(state, FileFd::ReadOnly);
       int file_size = state_file.Size();
-      Prog->OverallProgress(0, file_size, 1, 
-                           _("Reading extended state information"));
+      if(Prog != NULL)
+        Prog->OverallProgress(0, file_size, 1, 
+                              _("Reading state information"));
 
       pkgTagFile tagfile(&state_file);
       pkgTagSection section;
@@ -125,16 +125,19 @@ bool pkgDepCache::readStateFile(OpProgress *Prog)
         // Silently ignore unknown packages and packages with no actual
         // version.
         if(!pkg.end() && !pkg.VersionList().end()) {
-           short reason = section.FindI("Remove-Reason", 
-                                        pkgCache::State::RemoveManual);
-           PkgState[pkg->ID].AutomaticRemove = reason;
-           //std::cout << "Set: " << pkgname << " to " << reason << std::endl;
+           short reason = section.FindI("Auto-Installed", 0);
+           if(reason > 0)
+              PkgState[pkg->ID].Flags  |= Flag::Auto;
+           if(_config->FindB("Debug::pkgAutoRemove",false))
+              std::cout << "Auto-Installed : " << pkgname << std::endl;
            amt+=section.size();
-           Prog->OverallProgress(amt, file_size, 1, 
-                                 _("Reading extended state information"));
+           if(Prog != NULL)
+              Prog->OverallProgress(amt, file_size, 1, 
+                                    _("Reading state information"));
         }
-        Prog->OverallProgress(file_size, file_size, 1, 
-                              _("Reading extended state information"));
+        if(Prog != NULL)
+           Prog->OverallProgress(file_size, file_size, 1, 
+                                 _("Reading state information"));
       }
    }
 
@@ -143,12 +146,12 @@ bool pkgDepCache::readStateFile(OpProgress *Prog)
 
 bool pkgDepCache::writeStateFile(OpProgress *prog)
 {
-   // FIXME: this function needs to be called inside the commit()
-   // of the package manager. so after 
-
    FileFd StateFile;
    string state = _config->FindDir("Dir::State") + "pkgstates";
 
+   if(_config->FindB("Debug::pkgAutoRemove",false))
+      std::clog << "pkgDepCache::writeStateFile()" << std::endl;
+
    if(!StateFile.Open(state, FileFd::WriteEmpty))
       return _error->Error(_("Failed to write StateFile %s"),
                           state.c_str());
@@ -156,23 +159,13 @@ bool pkgDepCache::writeStateFile(OpProgress *prog)
    std::ostringstream ostr;
    for(pkgCache::PkgIterator pkg=Cache->PkgBegin(); !pkg.end();pkg++) {
 
-      // clear out no longer installed pkg
-      if(PkgState[pkg->ID].Delete() || pkg.CurrentVer() == NULL) 
-        PkgState[pkg->ID].AutomaticRemove = pkgCache::State::RemoveUnknown;
-
-      // check if we have new information
-      if(PkgState[pkg->ID].Flags & pkgCache::Flag::Auto) {
-        std::cout << "pkg: " << pkg.Name() << " is auto-dep" << std::endl;
-        PkgState[pkg->ID].AutomaticRemove = pkgCache::State::RemoveRequired;
-      }
-
-      if(PkgState[pkg->ID].AutomaticRemove != pkgCache::State::RemoveUnknown) {
+      if(PkgState[pkg->ID].Flags & Flag::Auto) {
+        if(_config->FindB("Debug::pkgAutoRemove",false))
+           std::clog << "AutoInstal: " << pkg.Name() << std::endl;
         ostr.str(string(""));
-        ostr << "Package: " << pkg.Name()
-             << "\nRemove-Reason: "
-             << (int)(PkgState[pkg->ID].AutomaticRemove) << "\n\n";
+        ostr << "Package: " << pkg.Name() 
+             << "\nAuto-Installed: 1\n\n";
         StateFile.Write(ostr.str().c_str(), ostr.str().size());
-        //std::cout << "Writing auto-mark: " << ostr.str() << endl;
       }
    }
    return true;
@@ -715,7 +708,9 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
    
    P.Mode = ModeInstall;
    P.InstallVer = P.CandidateVer;
-   P.Flags &= ~Flag::Auto;
+   // invert the auto-flag only for new installs, not for upgrades
+   if(P.Status == 0)
+      P.Flags &= ~Flag::Auto;
    if (P.CandidateVer == (Version *)Pkg.CurrentVer())
       P.Mode = ModeKeep;
        
@@ -839,15 +834,6 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
    AddSizes(Pkg);
 }
                                                                        /*}}}*/
-// DepCache::SetDirty - Switch the package between dirty states                /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void pkgDepCache::SetDirty(PkgIterator const &Pkg, pkgCache::State::PkgRemoveState To)
-{
-   StateCache &P = PkgState[Pkg->ID];
-   P.DirtyState = To;
-}
-                                                                       /*}}}*/
 // DepCache::SetCandidateVersion - Change the candidate version                /*{{{*/
 // ---------------------------------------------------------------------
 /* */