[Aptitude-svn-commit] r4018 - in branches/aptitude-0.3/aptitude: . src/generic src/generic/problemresolver

Daniel Burrows dburrows at costa.debian.org
Wed Aug 31 19:31:14 UTC 2005


Author: dburrows
Date: Wed Aug 31 19:31:12 2005
New Revision: 4018

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc
   branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.cc
   branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.h
   branches/aptitude-0.3/aptitude/src/generic/problemresolver/solution.h
Log:
Canonicalize some of the resolver's debugging output.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Wed Aug 31 19:31:12 2005
@@ -1,5 +1,10 @@
 2005-08-31  Daniel Burrows  <dburrows at debian.org>
 
+	* src/generic/problemresolver/dummy_universe.cc, src/generic/problemresolver/dummy_universe.h, src/generic/problemresolver/solution.h, src/generic/aptitude_resolver_universe.cc:
+
+	  Canonicalize some of the debugging output of the resolver to
+	  make it a bit easier to verify that it works properly.
+
 	* src/generic/problemresolver/dummy_universe.cc:
 
 	  Don't put commas in the dumped form of dummy dependencies.

Modified: branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc	Wed Aug 31 19:31:12 2005
@@ -2,6 +2,8 @@
 
 #include "aptitude_resolver_universe.h"
 
+#include <problemresolver/solution.h>
+
 #include <sstream>
 
 using namespace std;
@@ -539,14 +541,22 @@
 
 std::ostream &operator<<(ostream &out, aptitude_resolver_dep d)
 {
+  std::vector<aptitude_resolver_version> solvers;
+  for(aptitude_resolver_dep::solver_iterator i=d.solvers_begin(); !i.end(); ++i)
+    solvers.push_back(*i);
+
+  generic_solution<aptitude_universe>::ver_name_lt lt;
+  sort(solvers.begin(), solvers.end(), lt);
+
   out << d.get_source().get_package().get_name()
       << " "
       << d.get_source().get_name()
       << " -> {";
 
-  for(aptitude_resolver_dep::solver_iterator i=d.solvers_begin(); !i.end(); ++i)
+  for(std::vector<aptitude_resolver_version>::const_iterator i = solvers.begin();
+      i != solvers.end(); ++i)
     {
-      if(i!=d.solvers_begin())
+      if(i != solvers.begin())
 	out << " ";
       out << (*i).get_package().get_name() << " "
 	  << (*i).get_name();

Modified: branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.cc	Wed Aug 31 19:31:12 2005
@@ -41,6 +41,31 @@
   throw NoSuchNameError("version of package "+name, the_name);
 }
 
+struct ver_ptr_name_lt
+{
+public:
+  bool operator()(const dummy_version *v1,
+		  const dummy_version *v2) const
+  {
+    int pncmp = v1->get_package().get_name().compare(v2->get_package().get_name());
+
+    if(pncmp != 0)
+      return pncmp < 0;
+    else
+      return v1->get_name() < v2->get_name();
+  }
+};
+
+dummy_dep::dummy_dep(dummy_version *_source,
+		     const std::vector<dummy_version *> &_target_set,
+		     unsigned int _ID, bool _soft)
+  :source(_source), target_set(_target_set), ID(_ID), soft(_soft)
+{
+
+  sort(target_set.begin(), target_set.end(),
+       ver_ptr_name_lt());
+}
+
 bool dummy_dep::broken() const
 {
   if(source->get_package().current_version() != *source)

Modified: branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/problemresolver/dummy_universe.h	Wed Aug 31 19:31:12 2005
@@ -240,10 +240,7 @@
 
   dummy_dep(dummy_version *_source,
 	    const std::vector<dummy_version *> &_target_set,
-	    unsigned int _ID, bool _soft)
-    :source(_source), target_set(_target_set), ID(_ID), soft(_soft)
-  {
-  }
+	    unsigned int _ID, bool _soft);
 
   bool is_soft() const
   {

Modified: branches/aptitude-0.3/aptitude/src/generic/problemresolver/solution.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/problemresolver/solution.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/problemresolver/solution.h	Wed Aug 31 19:31:12 2005
@@ -540,27 +540,115 @@
     return real_soln->package_modified(pkg);
   }
 
+  // The following operators are used to place the solution components
+  // in order by name, to better permit comparison of debugging output
+  // between versions.
+  struct package_action_pair_name_lt
+  {
+  public:
+    bool operator()(const std::pair<package, action> &p1,
+		    const std::pair<package, action> &p2) const
+    {
+      return std::string(p1.first.get_name()) < p2.first.get_name();
+    }
+  };
+
+  struct ver_name_lt
+  {
+  public:
+    int cmp(const version &v1, const version &v2) const
+    {
+      // EW: I don't have a formal standard on what get_name()
+      // returns, so force it to be a string here:
+      int pcmp = std::string(v1.get_package().get_name()).compare(v2.get_package().get_name());
+
+      if(pcmp != 0)
+	return pcmp;
+      else
+	return std::string(v1.get_name()).compare(v2.get_name());
+    }
+
+    bool operator()(const version &v1, const version &v2) const
+    {
+      return cmp(v1, v2) < 0;
+    }
+  };
+
+  struct dep_name_lt
+  {
+  public:
+    bool operator()(const dep &d1, const dep &d2) const
+    {
+      ver_name_lt vlt;
+
+      int scmp = vlt.cmp(d1.get_source(), d2.get_source());
+
+      if(scmp != 0)
+	return scmp < 0;
+      else
+	{
+	  typename dep::solver_iterator si1 = d1.solvers_begin();
+	  typename dep::solver_iterator si2 = d2.solvers_begin();
+
+	  while(!si1.end() && !si2.end())
+	    {
+	      scmp = vlt.cmp(*si1, *si2);
+
+	      if(scmp != 0)
+		return scmp < 0;
+
+	      ++si1;
+	      ++si2;
+	    }
+
+	  if(si1.end())
+	    {
+	      if(si2.end())
+		return false;
+	      else
+		return true;
+	    }
+	  else
+	    return false;
+	}
+    }
+  };
+
   void dump(std::ostream &out) const
   {
+    std::vector<std::pair<package, action> > actions;
+    for(typename imm::map<package, action>::const_iterator i = get_actions().begin();
+	i != get_actions().end(); ++i)
+      actions.push_back(*i);
+    sort(actions.begin(), actions.end(), package_action_pair_name_lt());
+
+
     out << "<";
-    for(typename imm::map<package, action>::const_iterator i=get_actions().begin();
-	i!=get_actions().end(); ++i)
+    for(typename std::vector<std::pair<package, action> >::const_iterator i = actions.begin();
+	i != actions.end(); ++i)
       {
-	if(i!=get_actions().begin())
+	if(i != actions.begin())
 	  out << ", ";
 	out << i->first.get_name() << ":=" << i->second.ver.get_name();
       }
     out << ">;";
 
 
+    std::vector<dep> unresolved_deps;
+    for(typename imm::set<dep>::const_iterator i = get_unresolved_soft_deps().begin();
+	i != get_unresolved_soft_deps().end(); ++i)
+      unresolved_deps.push_back(*i);
+    sort(unresolved_deps.begin(), unresolved_deps.end(), dep_name_lt());
+
+
     if(!get_unresolved_soft_deps().empty())
       {
 	out << "<!";
-	for(typename imm::set<dep>::const_iterator i
-	      = get_unresolved_soft_deps().begin();
-	    i != get_unresolved_soft_deps().end(); ++i)
+	for(typename std::vector<dep>::const_iterator i
+	      = unresolved_deps.begin();
+	    i != unresolved_deps.end(); ++i)
 	  {
-	    if(i != get_unresolved_soft_deps().begin())
+	    if(i != unresolved_deps.begin())
 	      out << ", ";
 	    out << *i;
 	  }
@@ -568,12 +656,18 @@
 	out << "!>;";
       }
 
+    std::vector<dep> broken_deps;
+    for(typename imm::set<dep>::const_iterator i = get_broken().begin();
+	i != get_broken().end(); ++i)
+      broken_deps.push_back(*i);
+    sort(broken_deps.begin(), broken_deps.end(), dep_name_lt());
+
     out << "[";
 
-    for(typename imm::set<dep>::const_iterator i=get_broken().begin();
-	i!=get_broken().end(); ++i)
+    for(typename std::vector<dep>::const_iterator i = broken_deps.begin();
+	i != broken_deps.end(); ++i)
       {
-	if(i!=get_broken().begin())
+	if(i != broken_deps.begin())
 	  out << ", ";
 	out << *i;
       }
@@ -582,13 +676,19 @@
 
     if(!get_forbidden_versions().empty())
       {
+	std::vector<version> forbidden_vers;
+	for(typename imm::map<version, dep>::const_iterator i = get_forbidden_versions().begin();
+	    i != get_forbidden_versions().end(); ++i)
+	  forbidden_vers.push_back(i->first);
+	sort(forbidden_vers.begin(), forbidden_vers.end(), ver_name_lt());
+
 	out << "!!";
-	for(typename imm::map<version, dep>::const_iterator i=get_forbidden_versions().begin();
-	    i!=get_forbidden_versions().end(); ++i)
+	for(typename std::vector<version>::const_iterator i = forbidden_vers.begin();
+	    i != forbidden_vers.end(); ++i)
 	  {
-	    if(i!=get_forbidden_versions().begin())
+	    if(i != forbidden_vers.begin())
 	      out << ", ";
-	    out << i->first.get_package().get_name() << " " << i->first.get_name();
+	    out << i->get_package().get_name() << " " << i->get_name();
 	  }
 	out << "!!;";
       }



More information about the Aptitude-svn-commit mailing list