[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