summaryrefslogtreecommitdiff
path: root/cmdline/apt-get.cc
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2009-09-24 18:54:50 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2009-09-24 18:54:50 +0200
commitb69e1424886f4fe3b5b00c05889117e3eb6333e3 (patch)
tree0a83d12626b66c17ef0f9298cd4bdb937881b477 /cmdline/apt-get.cc
parent3b5a76ae9ae425db6fda4ccc041fbb1e79fffc18 (diff)
parentb98f40fadef0ee5419e2315d82110869135e410f (diff)
merged from david
Diffstat (limited to 'cmdline/apt-get.cc')
-rw-r--r--cmdline/apt-get.cc43
1 files changed, 34 insertions, 9 deletions
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 1582fff85..c32d67226 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1049,17 +1049,42 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
pkgProblemResolver &Fix,bool Remove,bool BrokenFix,
unsigned int &ExpectedInst,bool AllowFail = true)
{
- /* This is a pure virtual package and there is a single available
- provides */
- if (Cache[Pkg].CandidateVer == 0 && Pkg->ProvidesList != 0 &&
- Pkg.ProvidesList()->NextProvides == 0)
+ /* This is a pure virtual package and there is a single available
+ candidate providing it. */
+ if (Cache[Pkg].CandidateVer == 0 && Pkg->ProvidesList != 0)
{
- pkgCache::PkgIterator Tmp = Pkg.ProvidesList().OwnerPkg();
- ioprintf(c1out,_("Note, selecting %s instead of %s\n"),
- Tmp.Name(),Pkg.Name());
- Pkg = Tmp;
+ pkgCache::PkgIterator Prov;
+ bool found_one = false;
+
+ for (pkgCache::PrvIterator P = Pkg.ProvidesList(); P; P++)
+ {
+ pkgCache::VerIterator const PVer = P.OwnerVer();
+ pkgCache::PkgIterator const PPkg = PVer.ParentPkg();
+
+ /* Ignore versions that are not a candidate. */
+ if (Cache[PPkg].CandidateVer != PVer)
+ continue;
+
+ if (found_one == false)
+ {
+ Prov = PPkg;
+ found_one = true;
+ }
+ else if (PPkg != Prov)
+ {
+ found_one = false; // we found at least two
+ break;
+ }
+ }
+
+ if (found_one == true)
+ {
+ ioprintf(c1out,_("Note, selecting %s instead of %s\n"),
+ Prov.Name(),Pkg.Name());
+ Pkg = Prov;
+ }
}
-
+
// Handle the no-upgrade case
if (_config->FindB("APT::Get::upgrade",true) == false &&
Pkg->CurrentVer != 0)