[Aptitude-svn-commit] r4231 - in branches/aptitude-0.3/aptitude: .
src/generic/problemresolver
Daniel Burrows
dburrows at costa.debian.org
Sat Sep 24 15:57:24 UTC 2005
Author: dburrows
Date: Sat Sep 24 15:57:21 2005
New Revision: 4231
Modified:
branches/aptitude-0.3/aptitude/ChangeLog
branches/aptitude-0.3/aptitude/src/generic/problemresolver/problemresolver.h
Log:
Add a set of 'approved breaks' as an eventual replacement for 'forced breaks'.
Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog (original)
+++ branches/aptitude-0.3/aptitude/ChangeLog Sat Sep 24 15:57:21 2005
@@ -2,6 +2,15 @@
* src/generic/problemresolver/problemresolver.h:
+ Add a set of "approved breaks" that should provide a more
+ sensible way of handling soft dependencies: instead of forbidden
+ the dependency to be solved outright, it just says that we
+ should place it in the 'unresolved' set whenever it comes up as
+ an option. In other words, it defers any solution in which an
+ action is labelled with that dependency.
+
+ * src/generic/problemresolver/problemresolver.h:
+
Fix the resolver indentation (finally).
2005-09-24 Rubén Porras <nahoo at inicia.es>
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 Sat Sep 24 15:57:21 2005
@@ -414,6 +414,11 @@
*/
std::set<dep> user_hardened;
+ /** Stores dependencies that the user has said should be broken if
+ * they come up.
+ */
+ std::set<dep> user_approved_broken;
+
/** Stores generated solutions: */
std::vector<solution> generated_solutions;
@@ -1322,6 +1327,18 @@
return false;
}
+ bool solves_approved_broken(const solution &s) const
+ {
+ const imm::map<package, action> &actions = s.get_actions();
+
+ for(typename imm::map<package, action>::const_iterator
+ ai = actions.begin(); ai != actions.end(); ++ai)
+ if(user_approved_broken.find(ai->second.d) != user_approved_broken.end())
+ return true;
+
+ return false;
+ }
+
/** \return \b true if the given solution passed up an opportunity
* to include an 'mandated' version.
*/
@@ -1362,7 +1379,8 @@
*/
bool impinges_user_constraint(const dep &d) const
{
- if(user_hardened.find(d) != user_hardened.end())
+ if(user_hardened.find(d) != user_hardened.end() ||
+ user_approved_broken.find(d) != user_approved_broken.end())
return true;
for(typename dep::solver_iterator si = d.solvers_begin();
@@ -1387,7 +1405,7 @@
bool should_defer(const solution &s) const
{
return contains_rejected(s) || breaks_hardened(s) ||
- avoids_mandated(s);
+ avoids_mandated(s) || solves_approved_broken(s);
}
/** Place any solutions that were deferred and are no longer
@@ -2172,6 +2190,44 @@
}
}
+ /** \return \b true if the given dependency is in the
+ * approved-broken state.
+ */
+ bool is_approved_broken(const dep &d) const
+ {
+ return user_approved_broken.find(d) != user_approved_broken.end();
+ }
+
+ /** Approve the breaking of the given dependency. */
+ void approve_break(const dep &d, undo_group *undo = NULL) const
+ {
+ std::pair<typename std::set<dep>::const_iterator, bool>
+ insert_result = user_approved_broken.insert(d);
+
+ if(insert_result.second)
+ {
+ if(undo != NULL)
+ undo->add_item(new undo_resolver_manipulation<PackageUniverse, dep>(this, d, &generic_problem_resolver<PackageUniverse>::unapprove_break));
+
+ unharden(d, undo);
+ }
+ }
+
+ /** Cancel the required breaking of the given dependency. */
+ void unapprove_break(const dep &d, undo_group *undo = NULL) const
+ {
+ typename std::set<dep>::size_type erased_count
+ = user_approved_broken.erase(d);
+
+ if(erased_count > 0)
+ {
+ if(undo != NULL)
+ undo->add_item(new undo_resolver_manipulation<PackageUniverse, dep>(this, d, &generic_problem_resolver<PackageUniverse>::approve_break));
+
+ deferred_dirty = true;
+ }
+ }
+
/** Query whether the given dependency is forced to be broken. */
bool is_forced_broken(const dep &d) const
{
More information about the Aptitude-svn-commit
mailing list