[Aptitude-svn-commit] r3950 - in branches/aptitude-0.3/aptitude: .
src/generic
Daniel Burrows
dburrows at costa.debian.org
Thu Aug 25 02:21:51 UTC 2005
Author: dburrows
Date: Thu Aug 25 02:21:48 2005
New Revision: 3950
Modified:
branches/aptitude-0.3/aptitude/ChangeLog
branches/aptitude-0.3/aptitude/src/generic/aptitude_resolver_universe.cc
Log:
Don't crash when an UNINST version is passed to solved_by().
Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog (original)
+++ branches/aptitude-0.3/aptitude/ChangeLog Thu Aug 25 02:21:48 2005
@@ -1,5 +1,9 @@
2005-08-24 Daniel Burrows <dburrows at debian.org>
+ * src/generic/aptitude_resolver_universe.cc:
+
+ Don't crash when an UNINST version is passed to solved_by().
+
* tests/test_apt_universe.cc:
Handle dependency sources correctly when testing the solver
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 Thu Aug 25 02:21:48 2005
@@ -261,38 +261,51 @@
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;
- }
+ {
+ // Of course, installing an end version never fixes a
+ // non-conflict unless it removes the source (tested for above).
+ if(v.get_ver().end())
+ return false;
+
+ 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())
{
+ if(d.TargetPkg() != v.get_pkg())
+ return false;
+
+ if(v.get_ver().end())
+ return true;
+
// Check the non-virtual part of the conflict: the package is
// the same and the version **doesn't** match.
- return (d.TargetPkg() == v.get_pkg() &&
- !(!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
- d->CompareOp,
- d.TargetVer())));
+ return !(!d.TargetVer() || _system->VS->CheckDep(v.get_ver().VerStr(),
+ d->CompareOp,
+ d.TargetVer()));
}
else
{
- if(d.TargetVer())
- return false;
+ // Since dependencies are never versioned, I never create
+ // dependency objects for versioned dependencies that go through
+ // Provides.
+ assert(!d.TargetVer());
- // 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;
+ if(v.get_pkg() != const_cast<pkgCache::PrvIterator &>(prv).OwnerPkg())
+ return false;
+ else
+ return v.get_ver() == const_cast<pkgCache::PrvIterator &>(prv).OwnerVer();
return false;
}
More information about the Aptitude-svn-commit
mailing list