]> git.saurik.com Git - apt.git/commitdiff
Merge remote-tracking branch 'donkult/debian/sid' into debian/experimental
authorMichael Vogt <mvo@debian.org>
Wed, 18 Jun 2014 09:21:35 +0000 (11:21 +0200)
committerMichael Vogt <mvo@debian.org>
Wed, 18 Jun 2014 09:24:16 +0000 (11:24 +0200)
Conflicts:
apt-private/private-install.cc

24 files changed:
apt-pkg/contrib/strutl.cc
apt-pkg/edsp.cc
apt-pkg/upgrade.cc
apt-private/private-install.cc
apt-private/private-install.h
apt-private/private-output.cc
apt-private/private-output.h
apt-private/private-update.cc
apt-private/private-upgrade.cc
cmdline/apt-internal-solver.cc
cmdline/makefile
doc/apt-secure.8.xml
doc/external-dependency-solver-protocol.txt
doc/po/apt-doc.pot
doc/po/de.po
doc/po/es.po
doc/po/fr.po
doc/po/it.po
doc/po/ja.po
doc/po/pl.po
doc/po/pt.po
doc/po/pt_BR.po
test/integration/test-external-dependency-solver-protocol
test/libapt/strutil_test.cc

index 2100ee47b3c84dcc8efe313724b12a312239f7ee..ce69c7a027ea6306c5a1d421e8c756fcd9885a4a 100644 (file)
@@ -434,23 +434,30 @@ string TimeToStr(unsigned long Sec)
 /* This replaces all occurrences of Subst with Contents in Str. */
 string SubstVar(const string &Str,const string &Subst,const string &Contents)
 {
+   if (Subst.empty() == true)
+      return Str;
+
    string::size_type Pos = 0;
    string::size_type OldPos = 0;
    string Temp;
-   
-   while (OldPos < Str.length() && 
+
+   while (OldPos < Str.length() &&
          (Pos = Str.find(Subst,OldPos)) != string::npos)
    {
-      Temp += string(Str,OldPos,Pos) + Contents;
-      OldPos = Pos + Subst.length();      
+      if (OldPos != Pos)
+        Temp.append(Str, OldPos, Pos - OldPos);
+      if (Contents.empty() == false)
+        Temp.append(Contents);
+      OldPos = Pos + Subst.length();
    }
-   
+
    if (OldPos == 0)
       return Str;
-   
+
+   if (OldPos >= Str.length())
+      return Temp;
    return Temp + string(Str,OldPos);
 }
-
 string SubstVar(string Str,const struct SubstVar *Vars)
 {
    for (; Vars->Subst != 0; Vars++)
index 6d1b68c23138f218de67a9b780da05b088f017c2..0d0418e0633c52c191dde8d4b4a6f38448db2465 100644 (file)
@@ -26,6 +26,7 @@
 #include <time.h>
 #include <unistd.h>
 #include <stdio.h>
+#include <algorithm>
 #include <iostream>
 #include <vector>
 #include <limits>
@@ -50,7 +51,12 @@ bool EDSP::WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress)
    if (Progress != NULL)
       Progress->SubProgress(Cache.Head().VersionCount, _("Send scenario to solver"));
    unsigned long p = 0;
+   std::vector<std::string> archs = APT::Configuration::getArchitectures();
    for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
+   {
+      std::string const arch = Pkg.Arch();
+      if (std::find(archs.begin(), archs.end(), arch) == archs.end())
+        continue;
       for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver, ++p)
       {
         WriteScenarioVersion(Cache, output, Pkg, Ver);
@@ -59,6 +65,7 @@ bool EDSP::WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress)
         if (Progress != NULL && p % 100 == 0)
            Progress->Progress(p);
       }
+   }
    return true;
 }
                                                                        /*}}}*/
index 7926845c21b567347973cee31d7d51b024b34305..29b11937b391fd8164a6ccca1e3e2a9957351351 100644 (file)
@@ -143,6 +143,12 @@ static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache)
  */
 static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache)
 {
+   std::string const solver = _config->Find("APT::Solver", "internal");
+   if (solver != "internal") {
+      OpTextProgress Prog(*_config);
+      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
+   }
+
    pkgDepCache::ActionGroup group(Cache);
 
    pkgProblemResolver Fix(&Cache);
index 3b94237b4f15bdeaaf3c6875d8c564d5dcecfe52..55893bda05941e503611102b96e5cb68a7cbdf05 100644 (file)
@@ -19,7 +19,7 @@
 #include <apt-pkg/macros.h>
 #include <apt-pkg/packagemanager.h>
 #include <apt-pkg/pkgcache.h>
-#include <apt-pkg/sourcelist.h>
+#include <apt-pkg/upgrade.h>
 #include <apt-pkg/install-progress.h>
 
 #include <errno.h>
@@ -527,15 +527,14 @@ static bool DoAutomaticRemove(CacheFile &Cache)
 static const unsigned short MOD_REMOVE = 1;
 static const unsigned short MOD_INSTALL = 2;
 
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache)
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode)
 {
    std::map<unsigned short, APT::VersionSet> verset;
-   return DoCacheManipulationFromCommandLine(CmdL, Cache, verset);
+   return DoCacheManipulationFromCommandLine(CmdL, Cache, verset, UpgradeMode);
 }
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
-                                        std::map<unsigned short, APT::VersionSet> &verset)
+                                        std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode)
 {
-
    // Enter the special broken fixing mode if the user specified arguments
    bool BrokenFix = false;
    if (Cache->BrokenCount() != 0)
@@ -620,7 +619,17 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
       if (Fix != NULL)
       {
         // Call the scored problem resolver
-        if (Fix->Resolve(true) == false && Cache->BrokenCount() == 0)
+        bool resolver_fail = false;
+        if (UpgradeMode == 0)
+        {
+           if (strcmp(CmdL.FileList[0], "dist-upgrade") == 0 || strcmp(CmdL.FileList[0], "full-upgrade") == 0)
+              resolver_fail = APT::Upgrade::Upgrade(Cache, 0);
+           else
+              resolver_fail = Fix->Resolve(true);
+        } else
+           resolver_fail = APT::Upgrade::Upgrade(Cache, UpgradeMode);
+
+        if (resolver_fail == false && Cache->BrokenCount() == 0)
            return false;
       }
 
@@ -703,7 +712,7 @@ bool DoInstall(CommandLine &CmdL)
    
    std::map<unsigned short, APT::VersionSet> verset;
 
-   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, verset))
+   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, verset, 0))
       return false;
 
    /* Print out a list of packages that are going to be installed extra
index 828163e404497efa3213ffd1a6bda5d912cfd8bc..8daa4a7769e2e0c9939bf1476cfdcdd06cff1e1b 100644 (file)
@@ -21,8 +21,8 @@ class pkgProblemResolver;
 APT_PUBLIC bool DoInstall(CommandLine &Cmd);
 
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
-                                        std::map<unsigned short, APT::VersionSet> &verset);
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache);
+                                        std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode);
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode);
 
 APT_PUBLIC bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
                         bool Safety = true);
index 8f190a5516f2ab24833d0f12064fe5e5b2d82611..158bd5c71a37fa22eb118d7d96f4395e94250771 100644 (file)
@@ -344,129 +344,141 @@ bool ShowList(ostream &out,string Title,string List,string VersionsList)
            Depends: libldap2 (>= 2.0.2-2) but it is not going to be installed
            Depends: libsasl7 but it is not going to be installed   
  */
-void ShowBroken(ostream &out,CacheFile &Cache,bool Now)
+static void ShowBrokenPackage(ostream &out, pkgCacheFile * const Cache, pkgCache::PkgIterator const &Pkg, bool const Now)
 {
-   if (Cache->BrokenCount() == 0)
+   if (Now == true)
+   {
+      if ((*Cache)[Pkg].NowBroken() == false)
+        return;
+   }
+   else
+   {
+      if ((*Cache)[Pkg].InstBroken() == false)
+        return;
+   }
+
+   // Print out each package and the failed dependencies
+   out << " " << Pkg.FullName(true) << " :";
+   unsigned const Indent = Pkg.FullName(true).size() + 3;
+   bool First = true;
+   pkgCache::VerIterator Ver;
+
+   if (Now == true)
+      Ver = Pkg.CurrentVer();
+   else
+      Ver = (*Cache)[Pkg].InstVerIter(*Cache);
+
+   if (Ver.end() == true)
+   {
+      out << endl;
       return;
+   }
 
-   out << _("The following packages have unmet dependencies:") << endl;
-   for (unsigned J = 0; J < Cache->Head().PackageCount; J++)
+   for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false;)
    {
-      pkgCache::PkgIterator I(Cache,Cache.List[J]);
-      
+      // Compute a single dependency element (glob or)
+      pkgCache::DepIterator Start;
+      pkgCache::DepIterator End;
+      D.GlobOr(Start,End); // advances D
+
+      if ((*Cache)->IsImportantDep(End) == false)
+        continue;
+
       if (Now == true)
       {
-        if (Cache[I].NowBroken() == false)
+        if (((*Cache)[End] & pkgDepCache::DepGNow) == pkgDepCache::DepGNow)
            continue;
       }
       else
       {
-        if (Cache[I].InstBroken() == false)
+        if (((*Cache)[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
            continue;
       }
-      
-      // Print out each package and the failed dependencies
-      out << " " << I.FullName(true) << " :";
-      unsigned const Indent = I.FullName(true).size() + 3;
-      bool First = true;
-      pkgCache::VerIterator Ver;
-      
-      if (Now == true)
-        Ver = I.CurrentVer();
-      else
-        Ver = Cache[I].InstVerIter(Cache);
-      
-      if (Ver.end() == true)
-      {
-        out << endl;
-        continue;
-      }
-      
-      for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false;)
+
+      bool FirstOr = true;
+      while (1)
       {
-        // Compute a single dependency element (glob or)
-        pkgCache::DepIterator Start;
-        pkgCache::DepIterator End;
-        D.GlobOr(Start,End); // advances D
+        if (First == false)
+           for (unsigned J = 0; J != Indent; J++)
+              out << ' ';
+        First = false;
 
-        if (Cache->IsImportantDep(End) == false)
-           continue;
-        
-        if (Now == true)
+        if (FirstOr == false)
         {
-           if ((Cache[End] & pkgDepCache::DepGNow) == pkgDepCache::DepGNow)
-              continue;
+           for (unsigned J = 0; J != strlen(End.DepType()) + 3; J++)
+              out << ' ';
         }
         else
+           out << ' ' << End.DepType() << ": ";
+        FirstOr = false;
+
+        out << Start.TargetPkg().FullName(true);
+
+        // Show a quick summary of the version requirements
+        if (Start.TargetVer() != 0)
+           out << " (" << Start.CompType() << " " << Start.TargetVer() << ")";
+
+        /* Show a summary of the target package if possible. In the case
+           of virtual packages we show nothing */
+        pkgCache::PkgIterator Targ = Start.TargetPkg();
+        if (Targ->ProvidesList == 0)
         {
-           if ((Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
-              continue;
-        }
-        
-        bool FirstOr = true;
-        while (1)
-        {
-           if (First == false)
-              for (unsigned J = 0; J != Indent; J++)
-                 out << ' ';
-           First = false;
+           out << ' ';
+           pkgCache::VerIterator Ver = (*Cache)[Targ].InstVerIter(*Cache);
+           if (Now == true)
+              Ver = Targ.CurrentVer();
 
-           if (FirstOr == false)
+           if (Ver.end() == false)
            {
-              for (unsigned J = 0; J != strlen(End.DepType()) + 3; J++)
-                 out << ' ';
+              if (Now == true)
+                 ioprintf(out,_("but %s is installed"),Ver.VerStr());
+              else
+                 ioprintf(out,_("but %s is to be installed"),Ver.VerStr());
            }
            else
-              out << ' ' << End.DepType() << ": ";
-           FirstOr = false;
-           
-           out << Start.TargetPkg().FullName(true);
-        
-           // Show a quick summary of the version requirements
-           if (Start.TargetVer() != 0)
-              out << " (" << Start.CompType() << " " << Start.TargetVer() << ")";
-           
-           /* Show a summary of the target package if possible. In the case
-              of virtual packages we show nothing */    
-           pkgCache::PkgIterator Targ = Start.TargetPkg();
-           if (Targ->ProvidesList == 0)
            {
-              out << ' ';
-              pkgCache::VerIterator Ver = Cache[Targ].InstVerIter(Cache);
-              if (Now == true)
-                 Ver = Targ.CurrentVer();
-                   
-              if (Ver.end() == false)
+              if ((*Cache)[Targ].CandidateVerIter(*Cache).end() == true)
               {
-                 if (Now == true)
-                    ioprintf(out,_("but %s is installed"),Ver.VerStr());
+                 if (Targ->ProvidesList == 0)
+                    out << _("but it is not installable");
                  else
-                    ioprintf(out,_("but %s is to be installed"),Ver.VerStr());
-              }               
+                    out << _("but it is a virtual package");
+              }
               else
-              {
-                 if (Cache[Targ].CandidateVerIter(Cache).end() == true)
-                 {
-                    if (Targ->ProvidesList == 0)
-                       out << _("but it is not installable");
-                    else
-                       out << _("but it is a virtual package");
-                 }               
-                 else
-                    out << (Now?_("but it is not installed"):_("but it is not going to be installed"));
-              }               
+                 out << (Now?_("but it is not installed"):_("but it is not going to be installed"));
            }
-           
-           if (Start != End)
-              out << _(" or");
-           out << endl;
-           
-           if (Start == End)
-              break;
-           ++Start;
-        }       
-      }            
-   }   
+        }
+
+        if (Start != End)
+           out << _(" or");
+        out << endl;
+
+        if (Start == End)
+           break;
+        ++Start;
+      }
+   }
+}
+void ShowBroken(ostream &out, CacheFile &Cache, bool const Now)
+{
+   if (Cache->BrokenCount() == 0)
+      return;
+
+   out << _("The following packages have unmet dependencies:") << endl;
+   for (unsigned J = 0; J < Cache->Head().PackageCount; J++)
+   {
+      pkgCache::PkgIterator const I(Cache,Cache.List[J]);
+      ShowBrokenPackage(out, &Cache, I, Now);
+   }
+}
+void ShowBroken(ostream &out, pkgCacheFile &Cache, bool const Now)
+{
+   if (Cache->BrokenCount() == 0)
+      return;
+
+   out << _("The following packages have unmet dependencies:") << endl;
+   for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; ++Pkg)
+      ShowBrokenPackage(out, &Cache, Pkg, Now);
 }
                                                                        /*}}}*/
 // ShowNew - Show packages to newly install                            /*{{{*/
index 9633d0c37a6d077521b62d8b63befeb342d7be61..6f3a964d76124b09488d71873f9718d87b325d0a 100644 (file)
@@ -28,7 +28,8 @@ void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records,
 
 
 // helper to describe global state
-APT_PUBLIC void ShowBroken(std::ostream &out,CacheFile &Cache,bool Now);
+APT_PUBLIC void ShowBroken(std::ostream &out, CacheFile &Cache, bool const Now);
+APT_PUBLIC void ShowBroken(std::ostream &out, pkgCacheFile &Cache, bool const Now);
 
 APT_PUBLIC bool ShowList(std::ostream &out, std::string Title, std::string List,
               std::string VersionsList);
index fa827dea4216bd3689fa8d8ec15bb77c22d40897..0f2f7a8daf036beb711148f2a6b58782f4f30bf6 100644 (file)
@@ -86,11 +86,14 @@ bool DoUpdate(CommandLine &CmdL)
          if (I->CurrentVer != 0 && state.Upgradable())
             upgradable++;
       }
-      const char *msg = ngettext(
+      const char *msg = P_(
          "%i package can be upgraded. Run 'apt list --upgradable' to see it.\n",
          "%i packages can be upgraded. Run 'apt list --upgradable' to see them.\n",
          upgradable);
-      ioprintf(c1out, msg, upgradable);
+      if (upgradable == 0)
+         c1out << _("All packages are up to date.") << std::endl;
+      else
+         ioprintf(c1out, msg, upgradable);
    }
 
    return true;
index 68b2c5e00a2a31691470f8b0a7df6b5518f5a499..31f0675767a06ee97e96c5e6853a785a63594854 100644 (file)
@@ -23,18 +23,10 @@ static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags)
       return false;
 
    c0out << _("Calculating upgrade... ") << std::flush;
-   if (APT::Upgrade::Upgrade(Cache, UpgradeFlags) == false)
-   {
-      c0out << _("Failed") << std::endl;
-      ShowBroken(c1out,Cache,false);
-      return _error->Error(_("Internal error, Upgrade broke stuff"));
-   }
+   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, UpgradeFlags))
+      return false;
    c0out << _("Done") << std::endl;
 
-   // parse additional cmdline pkg manipulation switches
-   if(!DoCacheManipulationFromCommandLine(CmdL, Cache))
-      return false;
-   
    return InstallPackages(Cache,true);
 }
 
index 0cac12da23455d7b184a2bf04370a227b325df96..c24a96cdfa2d87152287e8c2c7ef30d15befba70 100644 (file)
 #include <apt-pkg/depcache.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+#include <apt-private/private-output.h>
 
 #include <string.h>
 #include <iostream>
+#include <sstream>
 #include <list>
 #include <string>
 #include <unistd.h>
@@ -171,18 +173,20 @@ int main(int argc,const char *argv[])                                     /*{{{*/
 
        EDSP::WriteProgress(60, "Call problemresolver on current scenario…", output);
 
+       std::string failure;
        if (upgrade == true) {
-               if (pkgAllUpgrade(CacheFile) == false) {
-                       EDSP::WriteError("ERR_UNSOLVABLE_UPGRADE", "An upgrade error occurred", output);
-                       return 0;
-               }
+               if (pkgAllUpgrade(CacheFile) == false)
+                       failure = "ERR_UNSOLVABLE_UPGRADE";
        } else if (distUpgrade == true) {
-               if (pkgDistUpgrade(CacheFile) == false) {
-                       EDSP::WriteError("ERR_UNSOLVABLE_DIST_UPGRADE", "An dist-upgrade error occurred", output);
-                       return 0;
-               }
-       } else if (Fix.Resolve() == false) {
-               EDSP::WriteError("ERR_UNSOLVABLE", "An error occurred", output);
+               if (pkgDistUpgrade(CacheFile) == false)
+                       failure = "ERR_UNSOLVABLE_DIST_UPGRADE";
+       } else if (Fix.Resolve() == false)
+               failure = "ERR_UNSOLVABLE";
+
+       if (failure.empty() == false) {
+               std::ostringstream broken;
+               ShowBroken(broken, CacheFile, false);
+               EDSP::WriteError(failure.c_str(), broken.str(), output);
                return 0;
        }
 
index c4a249cd6c4bbc2bc889056b1eda906677a9e8ff..b7c35ddd1c04086c1fc5669a4dc741dd9b6a3a1c 100644 (file)
@@ -8,49 +8,49 @@ include ../buildlib/defaults.mak
 # The apt program
 PROGRAM=apt
 SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt.cc
 include $(PROGRAM_H)
 
 # The apt-cache program
 PROGRAM=apt-cache
 SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-cache.cc
 include $(PROGRAM_H)
 
 # The apt-get program
 PROGRAM=apt-get
 SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-get.cc 
 include $(PROGRAM_H)
 
 # The apt-config program
 PROGRAM=apt-config
 SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-config.cc
 include $(PROGRAM_H)
 
 # The apt-cdrom program
 PROGRAM=apt-cdrom
 SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-cdrom.cc 
 include $(PROGRAM_H)
 
 # The apt-mark program
 PROGRAM=apt-mark
 SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-mark.cc
 include $(PROGRAM_H)
 
 # The apt-helper
 PROGRAM=apt-helper
 SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-helper.cc
 include $(PROGRAM_H)
 
@@ -75,14 +75,14 @@ include $(PROGRAM_H)
 # The apt-extracttemplates program
 PROGRAM=apt-extracttemplates
 SLIBS = -lapt-pkg -lapt-inst $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+LIB_MAKES = apt-pkg/makefile apt-inst/makefile
 SOURCE = apt-extracttemplates.cc 
 include $(PROGRAM_H)
 
 # The internal solver acting as an external
 PROGRAM=apt-internal-solver
-SLIBS = -lapt-pkg $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-internal-solver.cc
 include $(PROGRAM_H)
 
index 981351615fde69672fcbef7bdd7c164a89961ace..15a73476d174de54b16ec6514622f87fb39c77d3 100644 (file)
 <refsect1><title>See Also</title> 
 <para> 
 &apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;,
-&debsign; &debsig-verify;, &gpg;
+&debsign;, &debsig-verify;, &gpg;
 </para>
 
 <para>For more background information you might want to review the
index 790f2f1ee80a511f708a86f01589f5de687a92b4..14e9528c8469bf588f28cef30a9b5af3592552b3 100644 (file)
@@ -5,6 +5,14 @@ external dependency solvers. The protocol is called APT EDSP, for "APT
 External Dependency Solver Protocol".
 
 
+## Terminology
+
+In the following we use the term **architecture qualified package name**
+(or *arch-qualified package names* for short) to refer to package
+identifiers of the form "package:arch" where "package" is a package name
+and "arch" a dpkg architecture.
+
+
 ## Components
 
 - **APT**: we know this one.
@@ -62,6 +70,7 @@ configuration documentation for more, and more up to date, information.
 - **Dir::Bin::Solvers**: absolute path of the directory where to look for
   external solvers. Defaults to `/usr/lib/apt/solvers`.
 
+
 ## Protocol
 
 When configured to use an external solver, APT will resort to it to
@@ -132,9 +141,9 @@ The following **configuration fields** are supported in request stanzas:
 The following **action fields** are supported in request stanzas:
 
 - **Install:** (optional, defaults to the empty string) A space
-  separated list of package names, with *no version attached*, to
-  install. This field denotes a list of packages that the user wants to
-  install, usually via an APT `install` request.
+  separated list of arch-qualified package names, with *no version
+  attached*, to install. This field denotes a list of packages that the
+  user wants to install, usually via an APT `install` request.
 
 - **Remove:** (optional, defaults to the empty string) Same syntax of
   Install. This field denotes a list of packages that the user wants to
@@ -201,7 +210,7 @@ field. The following fields are supported in package stanzas:
 - **APT-Candidate:** (optional, defaults to `no`). Allowed values:
   `yes`, `no`. When set to `yes`, the corresponding package is the APT
   candidate for installation among all available packages with the same
-  name.
+  name and architecture.
 
 - **APT-Automatic:** (optional, defaults to `no`). Allowed values:
   `yes`, `no`. When set to `yes`, the corresponding package is marked by
@@ -218,6 +227,7 @@ field. The following fields are supported in package stanzas:
   Release file entry (Origin, Label, Codename, etc.) in the format of
   APT_PREFERENCES(5).
 
+
 ### Answer
 
 An answer from the external solver to APT is either a *solution* or an
@@ -226,11 +236,11 @@ An answer from the external solver to APT is either a *solution* or an
 The following invariant on **exit codes** must hold true. When the
 external solver is *able to find a solution*, it will write the solution
 to standard output and then exit with an exit code of 0. When the
-external solver is *unable to find a solution* (and s aware of that), it
-will write an error to standard output and then exit with an exit code
-of 0. An exit code other than 0 will be interpreted as a solver crash
-with no meaningful error about dependency resolution to convey to the
-user.
+external solver is *unable to find a solution* (and is aware of that),
+it will write an error to standard output and then exit with an exit
+code of 0. An exit code other than 0 will be interpreted as a solver
+crash with no meaningful error about dependency resolution to convey to
+the user.
 
 
 #### Solution
index a058e65067df0a1689a3ab1d4d6a8ba7becf76ae..94ad1238d799f8faa357d5531dabded1f620d3f1 100644 (file)
@@ -2153,7 +2153,7 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
index b048d966178bd12004598fafbd5acc842af7da3e..98bfcb6e472659466eef6047a075024d8a2fae66 100644 (file)
@@ -726,7 +726,7 @@ msgid ""
 "installed instead of removed."
 msgstr ""
 "<literal>remove</literal> ist identisch mit <literal>install</literal>, mit "
-"der Ausnahme, dass Pakte entfernt anstatt installiert werden. Beachten Sie, "
+"der Ausnahme, dass Pakete entfernt anstatt installiert werden. Beachten Sie, "
 "dass das Entfernen von Paketen deren Konfigurationsdateien im System "
 "belässt. Wenn ein Pluszeichen an den Paketnamen angehängt wird (ohne "
 "Leerzeichen dazwischen) wird das erkannte Paket installiert anstatt entfernt."
@@ -1051,7 +1051,7 @@ msgid ""
 "you wish to upgrade, and if a newer version is available, it (and its "
 "dependencies, as described above) will be downloaded and installed."
 msgstr ""
-"Dies ist außerdem die bevorzugt zu benutzende Art, wenn Sie Sie ein Upgrade "
+"Dies ist außerdem die bevorzugt zu benutzende Art, wenn Sie ein Upgrade "
 "eines oder mehrerer bereits installierter Pakete durchführen möchten, ohne "
 "ein Upgrade aller Pakete, die Sie auf Ihrem System haben, durchzuführen. "
 "Anders als das Ziel von »upgrade«, das die neusten Versionen aller aktuell "
@@ -3010,10 +3010,10 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 
 #. type: Content of: <refentry><refsect1><para>
 #: apt-secure.8.xml:199
index 2cf3a070aa941e5e0f88a5dd2c1dc11fcfe61fd5..0b594afe9121f173e881aff39fed19fe71391a67 100644 (file)
@@ -3098,10 +3098,10 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 
 #. type: Content of: <refentry><refsect1><para>
 #: apt-secure.8.xml:199
index 530de50463d962f273b0bfc9c23f518d25de6e37..0c69a1482cbf65ca64614f471c39e5eeb20597f2 100644 (file)
@@ -3022,10 +3022,10 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 
 #. type: Content of: <refentry><refsect1><para>
 #: apt-secure.8.xml:199
index c5ef090ff5a3ef82d2f11c4a1a981e2e3ea6b577..fc098a6abf2fc735c279daa193089eedc3376ebb 100644 (file)
@@ -3033,10 +3033,10 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 
 #. type: Content of: <refentry><refsect1><para>
 #: apt-secure.8.xml:199
index 2475b810dafc2f9efa3ae03a18b67cc517202d55..5f127426afc6ffec27ea11474b86f9fed397e6cc 100644 (file)
@@ -2963,10 +2963,10 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 
 #. type: Content of: <refentry><refsect1><para>
 #: apt-secure.8.xml:199
index 5f92c521cbeee500f7ff21d64cf14735759607f1..66b494ff9209ff5444c5c3644f4806195f629d37 100644 (file)
@@ -3131,10 +3131,10 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 
 #. type: Content of: <refentry><refsect1><para>
 #: apt-secure.8.xml:199
index 6ebf93bc7314ab1756cd271fdb5285e42ee84550..b67dc8b0301565e8706717bf64f3209594b560b8 100644 (file)
@@ -3042,10 +3042,10 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 
 #. type: Content of: <refentry><refsect1><para>
 #: apt-secure.8.xml:199
index e9e785f087feb3ce653356616267475326e9d2a9..b1df8a068a6d1700013d557feacb8863072e5601 100644 (file)
@@ -2159,7 +2159,7 @@ msgstr ""
 #: apt-secure.8.xml:195
 msgid ""
 "&apt-conf;, &apt-get;, &sources-list;, &apt-key;, &apt-ftparchive;, "
-"&debsign; &debsig-verify;, &gpg;"
+"&debsign;, &debsig-verify;, &gpg;"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
index 09230d3832c9a7658fce49a5a486aa32cc4baadc..07d2441b6200d85a4844e6e6ddedefc563a5f21c 100755 (executable)
@@ -51,6 +51,12 @@ rm -f /tmp/dump.edsp
 testfailure aptget install --solver dump awesomecoolstuff:i386 -s
 testsuccess test -s /tmp/dump.edsp
 
+testsuccess aptget dist-upgrade -s
+testsuccess aptget dist-upgrade -s --solver apt
+
+testsuccess aptget upgrade -s
+testsuccess aptget upgrade -s --solver apt
+
 configarchitecture 'armel'
 msgtest 'Test direct calling is okay for' 'apt-internal-solver'
 cat /tmp/dump.edsp | aptinternalsolver > solver.result 2>&1 || true
index bc004fd662d72d931154b01b038aa75cec94c78e..e9b778c6b858e3127a4d4df18d1e03171e2c5336 100644 (file)
@@ -70,3 +70,38 @@ TEST(StrUtilTest,EndsWith)
    EXPECT_FALSE(Endswith("abcd", "x"));
    EXPECT_FALSE(Endswith("abcd", "abcndefg"));
 }
+TEST(StrUtilTest,SubstVar)
+{
+   EXPECT_EQ("", SubstVar("", "fails", "passes"));
+   EXPECT_EQ("test ", SubstVar("test fails", "fails", ""));
+   EXPECT_EQ("test passes", SubstVar("test passes", "", "fails"));
+
+   EXPECT_EQ("test passes", SubstVar("test passes", "fails", "passes"));
+   EXPECT_EQ("test passes", SubstVar("test fails", "fails", "passes"));
+
+   EXPECT_EQ("starts with", SubstVar("beginnt with", "beginnt", "starts"));
+   EXPECT_EQ("beginnt with", SubstVar("starts with", "starts", "beginnt"));
+   EXPECT_EQ("is in middle", SubstVar("is in der middle", "in der", "in"));
+   EXPECT_EQ("is in der middle", SubstVar("is in middle", "in", "in der"));
+   EXPECT_EQ("does end", SubstVar("does enden", "enden", "end"));
+   EXPECT_EQ("does enden", SubstVar("does end", "end", "enden"));
+
+   EXPECT_EQ("abc", SubstVar("abc", "d", "a"));
+   EXPECT_EQ("abc", SubstVar("abd", "d", "c"));
+   EXPECT_EQ("abc", SubstVar("adc", "d", "b"));
+   EXPECT_EQ("abc", SubstVar("dbc", "d", "a"));
+
+   EXPECT_EQ("b", SubstVar("b", "aa", "a"));
+   EXPECT_EQ("bb", SubstVar("bb", "aa", "a"));
+   EXPECT_EQ("bbb", SubstVar("bbb", "aa", "a"));
+
+   EXPECT_EQ("aa", SubstVar("aaaa", "aa", "a"));
+   EXPECT_EQ("aaaa", SubstVar("aa", "a", "aa"));
+   EXPECT_EQ("aaaa", SubstVar("aaaa", "a", "a"));
+   EXPECT_EQ("a a a a ", SubstVar("aaaa", "a", "a "));
+
+   EXPECT_EQ(" bb bb bb bb ", SubstVar(" a a a a ", "a", "bb"));
+   EXPECT_EQ(" bb bb bb bb ", SubstVar(" aaa aaa aaa aaa ", "aaa", "bb"));
+   EXPECT_EQ(" bb a bb a bb a bb ", SubstVar(" aaa a aaa a aaa a aaa ", "aaa", "bb"));
+
+}