]> git.saurik.com Git - apt.git/blobdiff - apt-private/private-install.cc
correct cross & disappear progress detection
[apt.git] / apt-private / private-install.cc
index 63e7b734d65bc313f7287df7dddfbffa88243e88..761e4d1750fbaeedab33ea6a02258b249a9a7451 100644 (file)
@@ -48,6 +48,10 @@ bool CheckNothingBroken(CacheFile &Cache)                            /*{{{*/
    if (Cache->BrokenCount() == 0)
       return true;
 
+   // FIXME: if an external solver showed an error, we shouldn't show one here
+   if (_error->PendingError() && _config->Find("APT::Solver") == "dump")
+      return false;
+
    c1out <<
       _("Some packages could not be installed. This may mean that you have\n"
            "requested an impossible situation or if you are using the unstable\n"
@@ -422,11 +426,11 @@ bool DoAutomaticRemove(CacheFile &Cache)
       {
         if(Pkg.CurrentVer() != 0 || Cache[Pkg].Install())
            if(Debug)
-              std::cout << "We could delete %s" <<  Pkg.FullName(true).c_str() << std::endl;
+              std::cout << "We could delete " <<  APT::PrettyPkg(Cache, Pkg) << std::endl;
 
         if (doAutoRemove)
         {
-           if(Pkg.CurrentVer() != 0 && 
+           if(Pkg.CurrentVer() != 0 &&
               Pkg->CurrentState != pkgCache::State::ConfigFiles)
               Cache->MarkDelete(Pkg, purgePkgs, 0, false);
            else
@@ -471,11 +475,25 @@ bool DoAutomaticRemove(CacheFile &Cache)
                  if (R.IsNegative() == true ||
                      Cache->IsImportantDep(R) == false)
                     continue;
-                pkgCache::PkgIterator N = R.ParentPkg();
-                if (N.end() == true || (N->CurrentVer == 0 && (*Cache)[N].Install() == false))
+                auto const RV = R.ParentVer();
+                if (unlikely(RV.end() == true))
+                   continue;
+                auto const RP = RV.ParentPkg();
+                // check if that dependency comes from an interesting version
+                if (RP.CurrentVer() == RV)
+                {
+                   if ((*Cache)[RP].Keep() == false)
+                      continue;
+                }
+                else if (Cache[RP].CandidateVerIter(Cache) == RV)
+                {
+                   if ((*Cache)[RP].NewInstall() == false && (*Cache)[RP].Upgrade() == false)
+                      continue;
+                }
+                else // ignore dependency from a non-candidate version
                    continue;
                 if (Debug == true)
-                   std::clog << "Save " << APT::PrettyPkg(Cache, Pkg) << " as another installed garbage package depends on it" << std::endl;
+                   std::clog << "Save " << APT::PrettyPkg(Cache, Pkg) << " as another installed package depends on it: " << APT::PrettyPkg(Cache, RP) << std::endl;
                 Cache->MarkInstall(Pkg, false, 0, false);
                 if (hideAutoRemove == false)
                    ++autoRemoveCount;
@@ -491,6 +509,8 @@ bool DoAutomaticRemove(CacheFile &Cache)
         }
       } while (Changed == true);
    }
+   // trigger marking now so that the package list below is correct
+   group.release();
 
    // Now see if we had destroyed anything (if we had done anything)
    if (Cache->BrokenCount() != 0)
@@ -540,15 +560,15 @@ static const unsigned short MOD_INSTALL = 2;
 
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode)
 {
-   std::vector<const char*> VolatileCmdL;
+   std::vector<std::string> VolatileCmdL;
    return DoCacheManipulationFromCommandLine(CmdL, VolatileCmdL, Cache, UpgradeMode);
 }
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<const char*> &VolatileCmdL, CacheFile &Cache, int UpgradeMode)
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<std::string> &VolatileCmdL, CacheFile &Cache, int UpgradeMode)
 {
    std::map<unsigned short, APT::VersionSet> verset;
    return DoCacheManipulationFromCommandLine(CmdL, VolatileCmdL, Cache, verset, UpgradeMode);
 }
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<const char*> &VolatileCmdL, CacheFile &Cache,
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<std::string> &VolatileCmdL, CacheFile &Cache,
                                         std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode)
 {
    // Enter the special broken fixing mode if the user specified arguments
@@ -694,7 +714,7 @@ struct PkgIsExtraInstalled {
 bool DoInstall(CommandLine &CmdL)
 {
    CacheFile Cache;
-   std::vector<char const *> VolatileCmdL;
+   std::vector<std::string> VolatileCmdL;
    Cache.GetSourceList()->AddVolatileFiles(CmdL, &VolatileCmdL);
 
    // then open the cache