diff options
author | David Kalnischkies <kalnischkies@gmail.com> | 2009-09-24 12:58:38 +0200 |
---|---|---|
committer | David Kalnischkies <kalnischkies@gmail.com> | 2009-09-24 12:58:38 +0200 |
commit | 5e62aac041d57ecbfd07c7e1ec7822d5fbbba522 (patch) | |
tree | 6f9cb5a4c3776d54594f42c9f27c8be5f7f46eec | |
parent | 96bc713cb6f2b5442700a40a64f1c6315942d82a (diff) | |
download | apt-5e62aac041d57ecbfd07c7e1ec7822d5fbbba522.tar.gz |
When selecting a real package instead of a virtual one,
ignore versions for the same package that are not candidates.
This allows us to survive repositories that contain more than one
version of a package.
Bugreport #547788 and patch by Marius Vollmer, thanks!
-rw-r--r-- | cmdline/apt-get.cc | 43 | ||||
-rw-r--r-- | debian/changelog | 3 |
2 files changed, 37 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) diff --git a/debian/changelog b/debian/changelog index 5a9001658..dd56495b2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -46,6 +46,9 @@ apt (0.7.24) UNRELEASED; urgency=low * apt-pkg/deb/dpkgpm.cc, apt-pkg/packagemanager.cc, apt-pkg/orderlist.cc: - add and document _experimental_ options to make (aggressive) use of dpkg's trigger and configuration handling (Closes: #473461) + * cmdline/apt-get.cc: + - ignore versions that are not candidates when selecting a package + instead of a virtual one (by Marius Vollmer, Closes: #547788) [ Christian Perrier ] * doc/fr/*, doc/po/fr.po: |