[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