| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #include <config.h>
- #include <apt-pkg/cachefile.h>
- #include <apt-pkg/pkgcache.h>
- #include <apt-pkg/depcache.h>
- #include <apt-pkg/cacheiterators.h>
- #include <apt-pkg/configuration.h>
- #include <apt-pkg/progress.h>
- #include <apt-pkg/policy.h>
- #include <apt-private/private-cacheset.h>
- #include <stddef.h>
- #include <apti18n.h>
- bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile,
- APT::VersionContainerInterface * const vci,
- OpProgress * const progress)
- {
- Matcher null_matcher = Matcher();
- return GetLocalitySortedVersionSet(CacheFile, vci,
- null_matcher, progress);
- }
- bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile,
- APT::VersionContainerInterface * const vci,
- Matcher &matcher,
- OpProgress * const progress)
- {
- pkgCache *Cache = CacheFile.GetPkgCache();
- pkgDepCache *DepCache = CacheFile.GetDepCache();
- APT::CacheSetHelper helper(false);
- int Done=0;
- if (progress != NULL)
- progress->SubProgress(Cache->Head().PackageCount, _("Sorting"));
- bool const insertCurrentVer = _config->FindB("APT::Cmd::Installed", false);
- bool const insertUpgradable = _config->FindB("APT::Cmd::Upgradable", false);
- bool const insertManualInstalled = _config->FindB("APT::Cmd::Manual-Installed", false);
- for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; ++P)
- {
- if (progress != NULL)
- {
- if (Done % 500 == 0)
- progress->Progress(Done);
- ++Done;
- }
- // exclude virtual pkgs
- if (P->VersionList == 0)
- continue;
- if ((matcher)(P) == false)
- continue;
- pkgDepCache::StateCache &state = (*DepCache)[P];
- if (insertCurrentVer == true)
- {
- if (P->CurrentVer != 0)
- vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::INSTALLED, helper);
- }
- else if (insertUpgradable == true)
- {
- if(P.CurrentVer() && state.Upgradable())
- vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper);
- }
- else if (insertManualInstalled == true)
- {
- if (P.CurrentVer() &&
- ((*DepCache)[P].Flags & pkgCache::Flag::Auto) == false)
- vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper);
- }
- else
- {
- if (vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper) == false)
- {
- // no candidate, this may happen for packages in
- // dpkg "deinstall ok config-file" state - we pick the first ver
- // (which should be the only one)
- vci->insert(P.VersionList());
- }
- }
- }
- if (progress != NULL)
- progress->Done();
- return true;
- }
|