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

Daniel Burrows dburrows at costa.debian.org
Sat Sep 24 04:35:31 UTC 2005


Author: dburrows
Date: Sat Sep 24 04:35:29 2005
New Revision: 4216

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/src/generic/resolver_manager.cc
   branches/aptitude-0.3/aptitude/src/generic/resolver_manager.h
Log:
Add hooks for undo support in the resolver manager.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Sat Sep 24 04:35:29 2005
@@ -1,5 +1,10 @@
 2005-09-23  Daniel Burrows  <dburrows at debian.org>
 
+	* src/generic/resolver_manager.cc, src/generic/resolver_manager.h:
+
+	  Add support for tracking an undo stack for a resolver manager's
+	  state.
+
 	* src/generic/problemresolver/problemresolver.h, src/generic/problemresolver/resolver_undo.h:
 
 	  Correct a typo (generic_problem_resolver, not generic_resolver)

Modified: branches/aptitude-0.3/aptitude/src/generic/resolver_manager.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/resolver_manager.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/resolver_manager.cc	Sat Sep 24 04:35:29 2005
@@ -23,8 +23,8 @@
 #include "aptitude_resolver.h"
 #include "aptitude_resolver_universe.h"
 #include "config_signal.h"
-
 #include "problemresolver/problemresolver.h"
+#include "undo.h"
 
 #include <sigc++/functors/mem_fun.h>
 
@@ -36,6 +36,7 @@
 resolver_manager::resolver_manager(aptitudeDepCache *_cache)
   :cache(_cache),
    resolver(NULL),
+   undos(new undo_list),
    selected_solution(0),
    out_of_solutions(false),
    background_thread_killed(false),
@@ -65,6 +66,8 @@
 
   for(unsigned int i = 0; i < solutions.size(); ++i)
     delete solutions[i];
+
+  delete undos;
 }
 
 resolver_manager::background_continuation::~background_continuation()
@@ -291,6 +294,8 @@
 
   background_suspender bs(*this);
 
+  undos->clear_items();
+
   delete resolver;
 
   {
@@ -706,7 +711,12 @@
 
   assert(resolver);
 
-  resolver->reject_version(ver);
+  undo_group *undo = new undo_group;
+  resolver->reject_version(ver, undo);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
   l.release();
   state_changed();
@@ -719,7 +729,12 @@
 
   assert(resolver);
 
-  resolver->unreject_version(ver);
+  undo_group *undo = new undo_group;
+  resolver->unreject_version(ver, undo);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
 
   out_of_solutions.take();
@@ -744,7 +759,12 @@
 
   assert(resolver);
 
-  resolver->mandate_version(ver);
+  undo_group *undo = new undo_group;
+  resolver->mandate_version(ver, undo);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
   l.release();
   state_changed();
@@ -757,7 +777,12 @@
 
   assert(resolver);
 
-  resolver->unmandate_version(ver);
+  undo_group *undo = new undo_group;
+  resolver->unmandate_version(ver, undo);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
   out_of_solutions.take();
   out_of_solutions.put(false);
@@ -781,7 +806,12 @@
 
   assert(resolver);
 
-  resolver->harden(dep);
+  undo_group *undo = new undo_group;
+  resolver->harden(dep, undo);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
   l.release();
   state_changed();
@@ -794,7 +824,12 @@
 
   assert(resolver);
 
+  undo_group *undo = new undo_group;
   resolver->unharden(dep);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
   out_of_solutions.take();
   out_of_solutions.put(false);
@@ -818,7 +853,12 @@
 
   assert(resolver);
 
-  resolver->force_break(dep);
+  undo_group *undo = new undo_group;
+  resolver->force_break(dep, undo);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
   l.release();
   state_changed();
@@ -831,7 +871,12 @@
 
   assert(resolver);
 
-  resolver->unforce_break(dep);
+  undo_group *undo = new undo_group;
+  resolver->unforce_break(dep, undo);
+  if(undo->empty())
+    delete undo;
+  else
+    undos->add_item(undo);
 
   out_of_solutions.take();
   out_of_solutions.put(false);
@@ -848,6 +893,29 @@
   return resolver->is_forced_broken(dep);
 }
 
+bool resolver_manager::has_undo_items()
+{
+  threads::mutex::lock l(mutex);
+
+  return undos->size() > 0;
+}
+
+bool resolver_manager::undo()
+{
+  threads::mutex::lock l(mutex);
+
+  if(undos->size() > 0)
+    {
+      background_suspender bs(*this);
+
+      undos->undo();
+
+      return true;
+    }
+  else
+    return false;
+}
+
 void resolver_manager::select_solution(unsigned int solnum)
 {
   threads::mutex::lock l(mutex);

Modified: branches/aptitude-0.3/aptitude/src/generic/resolver_manager.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/generic/resolver_manager.h	(original)
+++ branches/aptitude-0.3/aptitude/src/generic/resolver_manager.h	Sat Sep 24 04:35:29 2005
@@ -44,6 +44,7 @@
 class aptitude_resolver_dep;
 template<typename PackageUniverse> class generic_solution;
 class aptitude_resolver;
+class undo_list;
 
 /** Manages a resolver for a single cache object.  When broken
  *  packages arise, a new resolver is created; whenever the state of a
@@ -158,6 +159,10 @@
   /** The active resolver, or \b NULL if none is active. */
   aptitude_resolver *resolver;
 
+  /** An undo list for resolver-specific items.  This is cleared
+   *  whenever the resolver is discarded.
+   */
+  undo_list *undos;
 
   /** The solutions generated by this manager since the last change to
    *  the cache.
@@ -443,6 +448,16 @@
   bool is_forced_broken(const aptitude_resolver_dep &dep);
 
 
+  /** \return \b true if undo items exist in this resolver manager. */
+  bool has_undo_items();
+
+  /** If this resolver has any undo items, invoke the "topmost" one.
+   *
+   *  \return \b true if an undo item was invoked.
+   */
+  bool undo();
+
+
   /** Set the selection pointer to a particular solution. */
   void select_solution(unsigned int solnum);
 



More information about the Aptitude-svn-commit mailing list