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

Daniel Burrows dburrows at costa.debian.org
Fri Aug 19 20:05:32 UTC 2005


Author: dburrows
Date: Fri Aug 19 20:05:28 2005
New Revision: 3923

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/aptitude_resolver_universe.h
   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/problemresolver.h
Log:
Change the meaning of acceptance: accepting an action now means that
alternatives will always be deferred for later.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Fri Aug 19 20:05:28 2005
@@ -1,3 +1,12 @@
+2005-08-19  Daniel Burrows  <dburrows at debian.org>
+
+	* src/generic/aptitude_resolver_universe.cc, src/generic/aptitude_resolver_universe.h, src/generic/problemresolver/dummy_universe.cc, src/generic/problemresolver/dummy_universe.h, src/generic/problemresolver/problemresolver.h:
+
+	  Redefine acceptedness of versions: instead of rejecting all
+	  other versions of the package (which is wrong anyway), accepting
+	  a version now discards any solution that *COULD* have picked
+	  that version but didn't.
+
 2005-08-18  Daniel Burrows  <dburrows at debian.org>
 
 	* doc/en/aptitude.xml:

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	Fri Aug 19 20:05:28 2005
@@ -251,6 +251,53 @@
     }
 }
 
+bool aptitude_resolver_dep::solved_by(const aptitude_resolver_version &v) const
+{
+  // First check for moving the source.
+  if(v.get_pkg() == const_cast<pkgCache::DepIterator &>(start).ParentPkg() && v.get_ver() != const_cast<pkgCache::DepIterator &>(start).ParentVer())
+    return true;
+
+  // Now check each of the members of the OR group.
+  pkgCache::DepIterator d = start;
+
+  if(start->Type != pkgCache::Dep::Conflicts)
+    while(1)
+      {
+	if(d.TargetPkg() == v.get_pkg() &&
+	   (!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
+						    d->CompareOp,
+						    d.TargetVer())))
+	  return true;
+
+	if((d->CompareOp & pkgCache::Dep::Or) != 0)
+	  ++d;
+	else
+	  return false;
+      }
+  else if(prv.end())
+    {
+      // Check the non-virtual part of the conflict: either the
+      // package differs or the version doesn't match.
+      return (d.TargetPkg() != v.get_pkg() ||
+	      !(!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
+							d->CompareOp,
+							d.TargetVer())));
+    }
+  else
+    {
+      if(d.TargetVer())
+	return false;
+
+      // Check the virtual part of the conflict.
+      for(pkgCache::PrvIterator p = v.get_ver().ProvidesList();
+	  !p.end(); ++p)
+	if(p.ParentPkg() == d.TargetPkg())
+	  return true;
+
+      return false;
+    }
+}
+
 aptitude_resolver_dep::solver_iterator &aptitude_resolver_dep::solver_iterator::operator++()
 {
   assert(!end());

Modified: branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.h	Fri Aug 19 20:05:28 2005
@@ -263,6 +263,9 @@
     return prv;
   }
 
+  /** Return \b true if the given version will resolve this dependency. */
+  bool solved_by(const aptitude_resolver_version &v) const;
+
   aptitude_resolver_version get_source() const
   {
     assert(!start.end());

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	Fri Aug 19 20:05:28 2005
@@ -54,6 +54,20 @@
   return true;
 }
 
+bool dummy_universe::dep::solved_by(const version &ver) const
+{
+  if(ver.get_package() == get_source().get_package() &&
+     ver != get_source())
+    return true;
+
+  for(dummy_dep::solver_iterator i = real_dep->solvers_begin();
+      i != real_dep->solvers_end(); ++i)
+    if(version(*i) == ver)
+      return true;
+
+  return false;
+}
+
 dummy_universe::~dummy_universe()
 {
   for(vector<dummy_package *>::const_iterator i=packages.begin();

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	Fri Aug 19 20:05:28 2005
@@ -461,6 +461,8 @@
 
       return true;
     }
+
+    bool solved_by(const version &other) const;
   };
 
 

Modified: branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h	Fri Aug 19 20:05:28 2005
@@ -261,9 +261,9 @@
   bool finished:1;
 
   /** If \b true, it is possible that some deferred solutions are
-   *  no longer rejected.
+   *  no longer "forbidden".
    */
-  bool rejections_dirty:1;
+  bool deferred_dirty:1;
 
   /** If \b true, debugging messages will be sent to stdout. */
   bool debug:1;
@@ -295,6 +295,11 @@
    */
   std::set<version> user_rejected;
 
+  /** Stores versions that have been mandated by the user; we should
+   *  always pick these versions if the chance arises.
+   */
+  std::set<version> user_mandated;
+
   /** Stores dependencies that have been "hardened" by the user (that
    *  aren't allowed to default).
    */
@@ -1066,10 +1071,44 @@
     return false;
   }
 
+  /** \return \b true if the given solution passed up an opportunity
+   *          to include an 'mandated' version.
+   */
+  bool avoids_mandated(const solution &s) const
+  {
+    // NB: The current algorithm is not terribly efficient.
+    for(typename std::set<version>::const_iterator ai = user_mandated.begin();
+	ai != user_mandated.end(); ++ai)
+      {
+	// If it's already being installed, then we're fine.
+	if(s.version_of(ai->get_package()) == *ai)
+	  continue;
+
+	// Check (very slowly) whether we made a decision where we had
+	// the opportunity to use this version (and of course didn't).
+	for(typename std::map<package, action>::const_iterator si = s.get_actions().begin();
+	    si != s.get_actions().end(); ++si)
+	  if(si->second.d.solved_by(*ai))
+	    {
+	      if(debug)
+		{
+		  std::cout << ai->get_package().get_name() << " version " << ai->get_name() << " is avoided by:" << std::endl;
+		  s.dump(std::cout);
+		  std::cout << std::endl;
+		}
+
+	      return true;
+	    }
+      }
+
+    return false;
+  }
+
   /** \return \b true if the given solution should be deferred. */
   bool should_defer(const solution &s) const
   {
-    return contains_rejected(s) || breaks_hardened(s);
+    return contains_rejected(s) || breaks_hardened(s) ||
+      avoids_mandated(s);
   }
 
   /** Place any solutions that were deferred and are no longer
@@ -1103,7 +1142,7 @@
     if(finished && !open.empty())
       finished = false;
 
-    rejections_dirty = false;
+    deferred_dirty = false;
   }
 
   /** \return \b true if the given solution is "irrelevant": that is,
@@ -1553,7 +1592,7 @@
      unfixed_soft_score(_unfixed_soft_score),
      minimum_score(-infinity), max_successors(_max_successors),
      full_solution_score(_full_solution_score),
-     universe(_universe), finished(false), rejections_dirty(false), debug(false), remove_stupid(true)
+     universe(_universe), finished(false), deferred_dirty(false), debug(false), remove_stupid(true)
   {
     version_scores=new int[universe.get_version_count()];
     for(size_t i=0; i<universe.get_version_count(); ++i)
@@ -1667,40 +1706,19 @@
   {
     user_rejected.erase(ver);
 
-    rejections_dirty = true;
+    deferred_dirty = true;
   }
 
   void mandate_version(const version &ver)
   {
-    package p = ver.get_package();
-
-    for(typename package::version_iterator vi = p.versions_begin();
-	!vi.end(); ++vi)
-      {
-	version v2 = *vi;
-
-	if(v2 == ver)
-	  unreject_version(v2);
-	else
-	  reject_version(v2);
-      }
+    user_mandated.insert(ver);
   }
 
   void unmandate_version(const version &ver)
   {
-    if(!is_mandatory(ver))
-      return;
-
-    package p = ver.get_package();
-
-    for(typename package::version_iterator vi = p.versions_begin();
-	!vi.end(); ++vi)
-      {
-	version v2 = *vi;
+    user_mandated.erase(ver);
 
-	if(v2 != ver)
-	  unreject_version(v2);
-      }
+    deferred_dirty = true;
   }
 
   /** Query whether the given version is rejected. */
@@ -1712,26 +1730,7 @@
   /** Query whether the given version is mandated. */
   bool is_mandatory(const version &ver) const
   {
-    package p = ver.get_package();
-
-    for(typename package::version_iterator vi = p.versions_begin();
-	!vi.end(); ++vi)
-      {
-	version v2 = *vi;
-
-	if(v2 == ver)
-	  {
-	    if(is_rejected(v2))
-	      return false;
-	  }
-	else
-	  {
-	    if(!is_rejected(v2))
-	      return false;
-	  }
-      }
-
-    return true;
+    return user_mandated.find(ver) != user_mandated.end();
   }
 
   /** Query whether the given dependency is hardened. */
@@ -1752,6 +1751,8 @@
   void unharden(const dep &d)
   {
     user_hardened.erase(d);
+
+    deferred_dirty = true;
   }
 
   /** Query whether the given dependency is forced to be broken. */
@@ -1823,7 +1824,7 @@
     // Counter for debugging (see below)
     int odometer = 0;
 
-    if(rejections_dirty)
+    if(deferred_dirty)
       reexamine_deferred();
 
     if(finished)



More information about the Aptitude-svn-commit mailing list