]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-get.cc
be able to disable resolver with APT::Get::AutoSolving
[apt.git] / cmdline / apt-get.cc
index bc2f71c18231df76ebc805f8f805d0e4d764c40b..d71b6fba746340ae1d2f71160e3ca06693a05f56 100644 (file)
@@ -382,8 +382,6 @@ void ShowNew(ostream &out,CacheFile &Cache)
    {
       pkgCache::PkgIterator I(Cache,Cache.List[J]);
       if (Cache[I].NewInstall() == true) {
-        if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-           continue;
          List += I.FullName(true) + " ";
          VersionsList += string(Cache[I].CandVersion) + "\n";
       }
@@ -406,8 +404,6 @@ void ShowDel(ostream &out,CacheFile &Cache)
       pkgCache::PkgIterator I(Cache,Cache.List[J]);
       if (Cache[I].Delete() == true)
       {
-        if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-           continue;
         if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge)
            List += I.FullName(true) + "* ";
         else
@@ -456,8 +452,6 @@ void ShowUpgraded(ostream &out,CacheFile &Cache)
       // Not interesting
       if (Cache[I].Upgrade() == false || Cache[I].NewInstall() == true)
         continue;
-      if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-        continue;
 
       List += I.FullName(true) + " ";
       VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
@@ -479,8 +473,6 @@ bool ShowDowngraded(ostream &out,CacheFile &Cache)
       // Not interesting
       if (Cache[I].Downgrade() == false || Cache[I].NewInstall() == true)
         continue;
-      if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-        continue;
 
       List += I.FullName(true) + " ";
       VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
@@ -584,9 +576,6 @@ void Stats(ostream &out,pkgDepCache &Dep)
    unsigned long ReInstall = 0;
    for (pkgCache::PkgIterator I = Dep.PkgBegin(); I.end() == false; I++)
    {
-      if (pkgCache::VerIterator(Dep, Dep[I].CandidateVer).Pseudo() == true)
-        continue;
-
       if (Dep[I].NewInstall() == true)
         Install++;
       else
@@ -775,7 +764,7 @@ struct TryToInstall {
    unsigned long AutoMarkChanged;
    APT::PackageSet doAutoInstallLater;
 
-   TryToInstall(pkgCacheFile &Cache, pkgProblemResolver &PM, bool const &FixBroken) : Cache(&Cache), Fix(&PM),
+   TryToInstall(pkgCacheFile &Cache, pkgProblemResolver *PM, bool const &FixBroken) : Cache(&Cache), Fix(PM),
                        FixBroken(FixBroken), AutoMarkChanged(0) {};
 
    void operator() (pkgCache::VerIterator const &Ver) {
@@ -793,8 +782,10 @@ struct TryToInstall {
         ioprintf(c1out,_("Skipping %s, it is not installed and only upgrades are requested.\n"),
                  Pkg.FullName(true).c_str());
       else {
-        Fix->Clear(Pkg);
-        Fix->Protect(Pkg);
+        if (Fix != NULL) {
+           Fix->Clear(Pkg);
+           Fix->Protect(Pkg);
+        }
         Cache->GetDepCache()->MarkInstall(Pkg,false);
 
         if (State.Install() == false) {
@@ -882,16 +873,19 @@ struct TryToRemove {
    bool PurgePkgs;
    unsigned long AutoMarkChanged;
 
-   TryToRemove(pkgCacheFile &Cache, pkgProblemResolver &PM) : Cache(&Cache), Fix(&PM),
+   TryToRemove(pkgCacheFile &Cache, pkgProblemResolver *PM) : Cache(&Cache), Fix(PM),
                                PurgePkgs(_config->FindB("APT::Get::Purge", false)) {};
 
    void operator() (pkgCache::VerIterator const &Ver)
    {
       pkgCache::PkgIterator Pkg = Ver.ParentPkg();
 
-      Fix->Clear(Pkg);
-      Fix->Protect(Pkg);
-      Fix->Remove(Pkg);
+      if (Fix != NULL)
+      {
+        Fix->Clear(Pkg);
+        Fix->Protect(Pkg);
+        Fix->Remove(Pkg);
+      }
 
       if ((Pkg->CurrentVer == 0 && PurgePkgs == false) ||
          (PurgePkgs == true && Pkg->CurrentState == pkgCache::State::NotInstalled))
@@ -1396,10 +1390,10 @@ bool TryToInstallBuildDep(pkgCache::PkgIterator Pkg,pkgCacheFile &Cache,
 
    if (Remove == true)
    {
-      TryToRemove RemoveAction(Cache, Fix);
+      TryToRemove RemoveAction(Cache, &Fix);
       RemoveAction(Pkg.VersionList());
    } else if (Cache[Pkg].CandidateVer != 0) {
-      TryToInstall InstallAction(Cache, Fix, BrokenFix);
+      TryToInstall InstallAction(Cache, &Fix, BrokenFix);
       InstallAction(Cache[Pkg].CandidateVerIter(Cache));
       InstallAction.doAutoInstall();
    } else
@@ -1718,7 +1712,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
                   R->Type != pkgCache::Dep::PreDepends)
                  continue;
               pkgCache::PkgIterator N = R.ParentPkg();
-              if (N.end() == true || N->CurrentVer == 0)
+              if (N.end() == true || (N->CurrentVer == 0 && (*Cache)[N].Install() == false))
                  continue;
               if (Debug == true)
                  std::clog << "Save " << P << " as another installed garbage package depends on it" << std::endl;
@@ -1802,8 +1796,10 @@ bool DoInstall(CommandLine &CmdL)
    bool BrokenFix = false;
    if (Cache->BrokenCount() != 0)
       BrokenFix = true;
-   
-   pkgProblemResolver Fix(Cache);
+
+   pkgProblemResolver* Fix = NULL;
+   if (_config->FindB("APT::Get::AutoSolving", true) == true)
+      Fix = new pkgProblemResolver(Cache);
 
    static const unsigned short MOD_REMOVE = 1;
    static const unsigned short MOD_INSTALL = 2;
@@ -1834,6 +1830,8 @@ bool DoInstall(CommandLine &CmdL)
    if (_error->PendingError() == true)
    {
       helper.showVirtualPackageErrors(Cache);
+      if (Fix != NULL)
+        delete Fix;
       return false;
    }
 
@@ -1848,17 +1846,29 @@ bool DoInstall(CommandLine &CmdL)
 
       for (unsigned short i = 0; order[i] != 0; ++i)
       {
-        if (order[i] == MOD_INSTALL) {
+        if (order[i] == MOD_INSTALL)
            InstallAction = std::for_each(verset[MOD_INSTALL].begin(), verset[MOD_INSTALL].end(), InstallAction);
+        else if (order[i] == MOD_REMOVE)
+           RemoveAction = std::for_each(verset[MOD_REMOVE].begin(), verset[MOD_REMOVE].end(), RemoveAction);
+      }
+
+      if (Fix != NULL)
+      {
+         for (unsigned short i = 0; order[i] != 0; ++i)
+         {
+           if (order[i] != MOD_INSTALL)
+              continue;
            InstallAction.propergateReleaseCandiateSwitching(helper.selectedByRelease, c0out);
            InstallAction.doAutoInstall();
         }
-        else if (order[i] == MOD_REMOVE)
-           RemoveAction = std::for_each(verset[MOD_REMOVE].begin(), verset[MOD_REMOVE].end(), RemoveAction);
       }
 
       if (_error->PendingError() == true)
+      {
+        if (Fix != NULL)
+           delete Fix;
         return false;
+      }
 
       /* If we are in the Broken fixing mode we do not attempt to fix the
         problems. This is if the user invoked install without -f and gave
@@ -1867,14 +1877,19 @@ bool DoInstall(CommandLine &CmdL)
       {
         c1out << _("You might want to run 'apt-get -f install' to correct these:") << endl;
         ShowBroken(c1out,Cache,false);
-
+        if (Fix != NULL)
+           delete Fix;
         return _error->Error(_("Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution)."));
       }
-   
-      // Call the scored problem resolver
-      Fix.InstallProtect();
-      if (Fix.Resolve(true) == false)
-        _error->Discard();
+
+      if (Fix != NULL)
+      {
+        // Call the scored problem resolver
+        Fix->InstallProtect();
+        if (Fix->Resolve(true) == false)
+           _error->Discard();
+        delete Fix;
+      }
 
       // Now we check the state of the packages,
       if (Cache->BrokenCount() != 0)
@@ -1916,8 +1931,6 @@ bool DoInstall(CommandLine &CmdL)
         if ((*Cache)[I].Install() == false)
            continue;
         pkgCache::VerIterator Cand = Cache[I].CandidateVerIter(Cache);
-        if (Cand.Pseudo() == true)
-           continue;
 
         if (verset[MOD_INSTALL].find(Cand) != verset[MOD_INSTALL].end())
            continue;
@@ -3291,7 +3304,10 @@ int main(int argc,const char *argv[])                                    /*{{{*/
    }
 
    // simulate user-friendly if apt-get has no root privileges
-   if (getuid() != 0 && _config->FindB("APT::Get::Simulate") == true)
+   if (getuid() != 0 && _config->FindB("APT::Get::Simulate") == true &&
+       (CmdL.FileSize() == 0 ||
+        (strcmp(CmdL.FileList[0], "source") != 0 && strcmp(CmdL.FileList[0], "download") != 0 &&
+         strcmp(CmdL.FileList[0], "changelog") != 0)))
    {
       if (_config->FindB("APT::Get::Show-User-Simulation-Note",true) == true)
         cout << _("NOTE: This is only a simulation!\n"