1 // -*- mode: cpp; mode: fold -*- 
   3 /* ###################################################################### 
   5    Simple wrapper around a std::set to provide a similar interface to 
   6    a set of cache structures as to the complete set of all structures 
   7    in the pkgCache. Currently only Package is supported. 
   9    ##################################################################### */ 
  11 // Include Files                                                        /*{{{*/ 
  14 #include <apt-pkg/aptconfiguration.h> 
  15 #include <apt-pkg/cachefile.h> 
  16 #include <apt-pkg/cachefilter.h> 
  17 #include <apt-pkg/cacheset.h> 
  18 #include <apt-pkg/error.h> 
  19 #include <apt-pkg/versionmatch.h> 
  20 #include <apt-pkg/pkgrecords.h> 
  21 #include <apt-pkg/policy.h> 
  22 #include <apt-pkg/cacheiterators.h> 
  23 #include <apt-pkg/configuration.h> 
  24 #include <apt-pkg/depcache.h> 
  25 #include <apt-pkg/macros.h> 
  26 #include <apt-pkg/pkgcache.h> 
  27 #include <apt-pkg/fileutl.h> 
  40 // PackageFrom - selecting the appropriate method for package selection /*{{{*/ 
  41 bool CacheSetHelper::PackageFrom(enum PkgSelector 
const select
, PackageContainerInterface 
* const pci
, 
  42       pkgCacheFile 
&Cache
, std::string 
const &pattern
) { 
  44         case UNKNOWN
: return false; 
  45         case REGEX
: return PackageFromRegEx(pci
, Cache
, pattern
); 
  46         case TASK
: return PackageFromTask(pci
, Cache
, pattern
); 
  47         case FNMATCH
: return PackageFromFnmatch(pci
, Cache
, pattern
); 
  48         case PACKAGENAME
: return PackageFromPackageName(pci
, Cache
, pattern
); 
  49         case STRING
: return PackageFromString(pci
, Cache
, pattern
); 
  54 // PackageFromTask - Return all packages in the cache from a specific task /*{{{*/ 
  55 bool CacheSetHelper::PackageFromTask(PackageContainerInterface 
* const pci
, pkgCacheFile 
&Cache
, std::string pattern
) { 
  56         size_t const archfound 
= pattern
.find_last_of(':'); 
  57         std::string arch 
= "native"; 
  58         if (archfound 
!= std::string::npos
) { 
  59                 arch 
= pattern
.substr(archfound
+1); 
  60                 pattern
.erase(archfound
); 
  63         if (pattern
[pattern
.length() -1] != '^') 
  65         pattern
.erase(pattern
.length()-1); 
  67         if (unlikely(Cache
.GetPkgCache() == 0 || Cache
.GetDepCache() == 0)) 
  70         bool const wasEmpty 
= pci
->empty(); 
  72                 pci
->setConstructor(CacheSetHelper::TASK
); 
  75         pkgRecords 
Recs(Cache
); 
  77         // build regexp for the task 
  80         snprintf(S
, sizeof(S
), "^Task:.*[, ]%s([, ]|$)", pattern
.c_str()); 
  81         if(regcomp(&Pattern
,S
, REG_EXTENDED 
| REG_NOSUB 
| REG_NEWLINE
) != 0) { 
  82                 _error
->Error("Failed to compile task regexp"); 
  87         for (pkgCache::GrpIterator Grp 
= Cache
->GrpBegin(); Grp
.end() == false; ++Grp
) { 
  88                 pkgCache::PkgIterator Pkg 
= Grp
.FindPkg(arch
); 
  89                 if (Pkg
.end() == true) 
  91                 pkgCache::VerIterator ver 
= Cache
[Pkg
].CandidateVerIter(Cache
); 
  95                 pkgRecords::Parser 
&parser 
= Recs
.Lookup(ver
.FileList()); 
  96                 const char *start
, *end
; 
  97                 parser
.GetRec(start
,end
); 
  98                 unsigned int const length 
= end 
- start
; 
  99                 if (unlikely(length 
== 0)) 
 102                 strncpy(buf
, start
, length
); 
 103                 buf
[length
-1] = '\0'; 
 104                 if (regexec(&Pattern
, buf
, 0, 0, 0) != 0) 
 108                 showPackageSelection(Pkg
, CacheSetHelper::TASK
, pattern
); 
 113         if (found 
== false) { 
 114                 canNotFindPackage(CacheSetHelper::TASK
, pci
, Cache
, pattern
); 
 115                 pci
->setConstructor(CacheSetHelper::UNKNOWN
); 
 119         if (wasEmpty 
== false && pci
->getConstructor() != CacheSetHelper::UNKNOWN
) 
 120                 pci
->setConstructor(CacheSetHelper::UNKNOWN
); 
 125 // PackageFromRegEx - Return all packages in the cache matching a pattern /*{{{*/ 
 126 bool CacheSetHelper::PackageFromRegEx(PackageContainerInterface 
* const pci
, pkgCacheFile 
&Cache
, std::string pattern
) { 
 127         static const char * const isregex 
= ".?+*|[^$"; 
 128         if (pattern
.find_first_of(isregex
) == std::string::npos
) 
 131         bool const wasEmpty 
= pci
->empty(); 
 132         if (wasEmpty 
== true) 
 133                 pci
->setConstructor(CacheSetHelper::REGEX
); 
 135         size_t archfound 
= pattern
.find_last_of(':'); 
 136         std::string arch 
= "native"; 
 137         if (archfound 
!= std::string::npos
) { 
 138                 arch 
= pattern
.substr(archfound
+1); 
 139                 if (arch
.find_first_of(isregex
) == std::string::npos
) 
 140                         pattern
.erase(archfound
); 
 145         if (unlikely(Cache
.GetPkgCache() == 0)) 
 148         APT::CacheFilter::PackageNameMatchesRegEx 
regexfilter(pattern
); 
 151         for (pkgCache::GrpIterator Grp 
= Cache
.GetPkgCache()->GrpBegin(); Grp
.end() == false; ++Grp
) { 
 152                 if (regexfilter(Grp
) == false) 
 154                 pkgCache::PkgIterator Pkg 
= Grp
.FindPkg(arch
); 
 155                 if (Pkg
.end() == true) { 
 156                         if (archfound 
== std::string::npos
) 
 157                                 Pkg 
= Grp
.FindPreferredPkg(true); 
 158                         if (Pkg
.end() == true) 
 163                 showPackageSelection(Pkg
, CacheSetHelper::REGEX
, pattern
); 
 167         if (found 
== false) { 
 168                 canNotFindPackage(CacheSetHelper::REGEX
, pci
, Cache
, pattern
); 
 169                 pci
->setConstructor(CacheSetHelper::UNKNOWN
); 
 173         if (wasEmpty 
== false && pci
->getConstructor() != CacheSetHelper::UNKNOWN
) 
 174                 pci
->setConstructor(CacheSetHelper::UNKNOWN
); 
 179 // PackageFromFnmatch - Returns the package defined  by this fnmatch    /*{{{*/ 
 180 bool CacheSetHelper::PackageFromFnmatch(PackageContainerInterface 
* const pci
, 
 181                                        pkgCacheFile 
&Cache
, std::string pattern
) 
 183         static const char * const isfnmatch 
= ".?*[]!"; 
 184         if (pattern
.find_first_of(isfnmatch
) == std::string::npos
) 
 187         bool const wasEmpty 
= pci
->empty(); 
 188         if (wasEmpty 
== true) 
 189                 pci
->setConstructor(CacheSetHelper::FNMATCH
); 
 191         size_t archfound 
= pattern
.find_last_of(':'); 
 192         std::string arch 
= "native"; 
 193         if (archfound 
!= std::string::npos
) { 
 194                 arch 
= pattern
.substr(archfound
+1); 
 195                 if (arch
.find_first_of(isfnmatch
) == std::string::npos
) 
 196                         pattern
.erase(archfound
); 
 201         if (unlikely(Cache
.GetPkgCache() == 0)) 
 204         APT::CacheFilter::PackageNameMatchesFnmatch 
filter(pattern
); 
 207         for (pkgCache::GrpIterator Grp 
= Cache
.GetPkgCache()->GrpBegin(); Grp
.end() == false; ++Grp
) { 
 208                 if (filter(Grp
) == false) 
 210                 pkgCache::PkgIterator Pkg 
= Grp
.FindPkg(arch
); 
 211                 if (Pkg
.end() == true) { 
 212                         if (archfound 
== std::string::npos
) 
 213                                 Pkg 
= Grp
.FindPreferredPkg(true); 
 214                         if (Pkg
.end() == true) 
 219                 showPackageSelection(Pkg
, CacheSetHelper::FNMATCH
, pattern
); 
 223         if (found 
== false) { 
 224                 canNotFindPackage(CacheSetHelper::FNMATCH
, pci
, Cache
, pattern
); 
 225                 pci
->setConstructor(CacheSetHelper::UNKNOWN
); 
 229         if (wasEmpty 
== false && pci
->getConstructor() != CacheSetHelper::UNKNOWN
) 
 230                 pci
->setConstructor(CacheSetHelper::UNKNOWN
); 
 235 // PackageFromName - Returns the package defined  by this string        /*{{{*/ 
 236 pkgCache::PkgIterator 
CacheSetHelper::PackageFromName(pkgCacheFile 
&Cache
, 
 237                         std::string 
const &str
) { 
 238         std::string pkg 
= str
; 
 239         size_t archfound 
= pkg
.find_last_of(':'); 
 241         if (archfound 
!= std::string::npos
) { 
 242                 arch 
= pkg
.substr(archfound
+1); 
 243                 pkg
.erase(archfound
); 
 246         if (Cache
.GetPkgCache() == 0) 
 247                 return pkgCache::PkgIterator(Cache
, 0); 
 249         pkgCache::PkgIterator 
Pkg(Cache
, 0); 
 250         if (arch
.empty() == true) { 
 251                 pkgCache::GrpIterator Grp 
= Cache
.GetPkgCache()->FindGrp(pkg
); 
 252                 if (Grp
.end() == false) 
 253                         Pkg 
= Grp
.FindPreferredPkg(); 
 255                 Pkg 
= Cache
.GetPkgCache()->FindPkg(pkg
, arch
); 
 257         if (Pkg
.end() == true) 
 258                 return canNotFindPkgName(Cache
, str
); 
 262 // PackageFromPackageName - Returns the package defined  by this string /*{{{*/ 
 263 bool CacheSetHelper::PackageFromPackageName(PackageContainerInterface 
* const pci
, pkgCacheFile 
&Cache
, 
 265         if (unlikely(Cache
.GetPkgCache() == 0)) 
 268         std::string 
const pkgstring 
= pkg
; 
 269         size_t const archfound 
= pkg
.find_last_of(':'); 
 271         if (archfound 
!= std::string::npos
) { 
 272                 arch 
= pkg
.substr(archfound
+1); 
 273                 pkg
.erase(archfound
); 
 274                 if (arch 
== "all" || arch 
== "native") 
 275                         arch 
= _config
->Find("APT::Architecture"); 
 278         pkgCache::GrpIterator Grp 
= Cache
.GetPkgCache()->FindGrp(pkg
); 
 279         if (Grp
.end() == false) { 
 280                 if (arch
.empty() == true) { 
 281                         pkgCache::PkgIterator Pkg 
= Grp
.FindPreferredPkg(); 
 282                         if (Pkg
.end() == false) 
 289                         // for 'linux-any' return the first package matching, for 'linux-*' return all matches 
 290                         bool const isGlobal 
= arch
.find('*') != std::string::npos
; 
 291                         APT::CacheFilter::PackageArchitectureMatchesSpecification 
pams(arch
); 
 292                         for (pkgCache::PkgIterator Pkg 
= Grp
.PackageList(); Pkg
.end() == false; Pkg 
= Grp
.NextPkg(Pkg
)) { 
 293                                 if (pams(Pkg
) == false) 
 297                                 if (isGlobal 
== false) 
 305         pkgCache::PkgIterator Pkg 
= canNotFindPkgName(Cache
, pkgstring
); 
 306         if (Pkg
.end() == true) 
 313 // PackageFromString - Return all packages matching a specific string   /*{{{*/ 
 314 bool CacheSetHelper::PackageFromString(PackageContainerInterface 
* const pci
, pkgCacheFile 
&Cache
, std::string 
const &str
) { 
 316         _error
->PushToStack(); 
 318         if (PackageFrom(CacheSetHelper::PACKAGENAME
, pci
, Cache
, str
) == false && 
 319                  PackageFrom(CacheSetHelper::TASK
, pci
, Cache
, str
) == false && 
 320                  // FIXME: hm, hm, regexp/fnmatch incompatible? 
 321                  PackageFrom(CacheSetHelper::FNMATCH
, pci
, Cache
, str
) == false && 
 322                  PackageFrom(CacheSetHelper::REGEX
, pci
, Cache
, str
) == false) 
 324                 canNotFindPackage(CacheSetHelper::PACKAGENAME
, pci
, Cache
, str
); 
 329                 _error
->RevertToStack(); 
 331                 _error
->MergeWithStack(); 
 335 // PackageFromCommandLine - Return all packages specified on commandline /*{{{*/ 
 336 bool CacheSetHelper::PackageFromCommandLine(PackageContainerInterface 
* const pci
, pkgCacheFile 
&Cache
, const char **cmdline
) { 
 338         for (const char **I 
= cmdline
; *I 
!= 0; ++I
) 
 339                 found 
|= PackageFrom(CacheSetHelper::STRING
, pci
, Cache
, *I
); 
 343 // FromModifierCommandLine - helper doing the work for PKG:GroupedFromCommandLine       /*{{{*/ 
 344 bool CacheSetHelper::PackageFromModifierCommandLine(unsigned short &modID
, PackageContainerInterface 
* const pci
, 
 345                                                         pkgCacheFile 
&Cache
, const char * cmdline
, 
 346                                                         std::list
<PkgModifier
> const &mods
) { 
 347         std::string str 
= cmdline
; 
 348         unsigned short fallback 
= modID
; 
 349         bool modifierPresent 
= false; 
 350         for (std::list
<PkgModifier
>::const_iterator mod 
= mods
.begin(); 
 351              mod 
!= mods
.end(); ++mod
) { 
 352                 size_t const alength 
= strlen(mod
->Alias
); 
 354                 case PkgModifier::POSTFIX
: 
 355                         if (str
.compare(str
.length() - alength
, alength
, 
 356                                         mod
->Alias
, 0, alength
) != 0) 
 358                         str
.erase(str
.length() - alength
); 
 361                 case PkgModifier::PREFIX
: 
 363                 case PkgModifier::NONE
: 
 366                 modifierPresent 
= true; 
 369         if (modifierPresent 
== true) { 
 370                 bool const errors 
= showErrors(false); 
 371                 bool const found 
= PackageFrom(PACKAGENAME
, pci
, Cache
, cmdline
); 
 378         return PackageFrom(CacheSetHelper::PACKAGENAME
, pci
, Cache
, str
); 
 381 // FromModifierCommandLine - helper doing the work for VER:GroupedFromCommandLine       /*{{{*/ 
 382 bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID
, 
 383                                                         VersionContainerInterface 
* const vci
, 
 384                                                         pkgCacheFile 
&Cache
, const char * cmdline
, 
 385                                                         std::list
<Modifier
> const &mods
, 
 386                                                         CacheSetHelper 
&helper
) { 
 387         CacheSetHelper::VerSelector select 
= CacheSetHelper::NEWEST
; 
 388         std::string str 
= cmdline
; 
 389         if (unlikely(str
.empty() == true)) 
 391         bool modifierPresent 
= false; 
 392         unsigned short fallback 
= modID
; 
 393         for (std::list
<Modifier
>::const_iterator mod 
= mods
.begin(); 
 394              mod 
!= mods
.end(); ++mod
) { 
 395                 if (modID 
== fallback 
&& mod
->ID 
== fallback
) 
 396                         select 
= mod
->SelectVersion
; 
 397                 size_t const alength 
= strlen(mod
->Alias
); 
 399                 case Modifier::POSTFIX
: 
 400                         if (str
.length() <= alength 
|| 
 401                               str
.compare(str
.length() - alength
, alength
, mod
->Alias
, 0, alength
) != 0) 
 403                         str
.erase(str
.length() - alength
); 
 405                         select 
= mod
->SelectVersion
; 
 407                 case Modifier::PREFIX
: 
 412                 modifierPresent 
= true; 
 415         if (modifierPresent 
== true) { 
 416                 bool const errors 
= helper
.showErrors(false); 
 417                 bool const found 
= VersionContainerInterface::FromString(vci
, Cache
, cmdline
, select
, helper
, true); 
 418                 helper
.showErrors(errors
); 
 424         return FromString(vci
, Cache
, str
, select
, helper
); 
 427 // FromCommandLine - Return all versions specified on commandline       /*{{{*/ 
 428 bool VersionContainerInterface::FromCommandLine(VersionContainerInterface 
* const vci
, 
 429                                                 pkgCacheFile 
&Cache
, const char **cmdline
, 
 430                                                 CacheSetHelper::VerSelector 
const fallback
, 
 431                                                 CacheSetHelper 
&helper
) { 
 433         for (const char **I 
= cmdline
; *I 
!= 0; ++I
) 
 434                 found 
|= VersionContainerInterface::FromString(vci
, Cache
, *I
, fallback
, helper
); 
 438 // FromString - Returns all versions spedcified by a string             /*{{{*/ 
 439 bool VersionContainerInterface::FromString(VersionContainerInterface 
* const vci
, 
 440                                            pkgCacheFile 
&Cache
, std::string pkg
, 
 441                                            CacheSetHelper::VerSelector 
const fallback
, 
 442                                            CacheSetHelper 
&helper
, 
 443                                            bool const onlyFromName
) { 
 445         bool verIsRel 
= false; 
 446         size_t const vertag 
= pkg
.find_last_of("/="); 
 447         if (vertag 
!= std::string::npos
) { 
 448                 ver 
= pkg
.substr(vertag
+1); 
 449                 verIsRel 
= (pkg
[vertag
] == '/'); 
 454         if (onlyFromName 
== false) 
 455                 helper
.PackageFrom(CacheSetHelper::STRING
, &pkgset
, Cache
, pkg
); 
 457                 helper
.PackageFrom(CacheSetHelper::PACKAGENAME
, &pkgset
, Cache
, pkg
); 
 461         if (pkgset
.getConstructor() != CacheSetHelper::UNKNOWN
) 
 462                 errors 
= helper
.showErrors(false); 
 465         for (PackageSet::const_iterator P 
= pkgset
.begin(); 
 466              P 
!= pkgset
.end(); ++P
) { 
 467                 if (vertag 
== std::string::npos
) { 
 468                         found 
|= VersionContainerInterface::FromPackage(vci
, Cache
, P
, fallback
, helper
); 
 471                 pkgCache::VerIterator V
; 
 472                 if (ver 
== "installed") 
 473                         V 
= getInstalledVer(Cache
, P
, helper
); 
 474                 else if (ver 
== "candidate") 
 475                         V 
= getCandidateVer(Cache
, P
, helper
); 
 476                 else if (ver 
== "newest") { 
 477                         if (P
->VersionList 
!= 0) 
 480                                 V 
= helper
.canNotGetVersion(CacheSetHelper::NEWEST
, Cache
, P
); 
 482                         pkgVersionMatch 
Match(ver
, (verIsRel 
== true ? pkgVersionMatch::Release 
: 
 483                                         pkgVersionMatch::Version
)); 
 485                         if (V
.end() == true) { 
 486                                 if (verIsRel 
== true) 
 487                                         _error
->Error(_("Release '%s' for '%s' was not found"), 
 488                                                         ver
.c_str(), P
.FullName(true).c_str()); 
 490                                         _error
->Error(_("Version '%s' for '%s' was not found"), 
 491                                                         ver
.c_str(), P
.FullName(true).c_str()); 
 497                 if (verIsRel 
== true) 
 498                         helper
.showVersionSelection(P
, V
, CacheSetHelper::RELEASE
, ver
); 
 500                         helper
.showVersionSelection(P
, V
, CacheSetHelper::VERSIONNUMBER
, ver
); 
 504         if (pkgset
.getConstructor() != CacheSetHelper::UNKNOWN
) 
 505                 helper
.showErrors(errors
); 
 509 // FromPackage - versions from package based on fallback                /*{{{*/ 
 510 bool VersionContainerInterface::FromPackage(VersionContainerInterface 
* const vci
, 
 512                                             pkgCache::PkgIterator 
const &P
, 
 513                                             CacheSetHelper::VerSelector 
const fallback
, 
 514                                             CacheSetHelper 
&helper
) { 
 515         pkgCache::VerIterator V
; 
 519         case CacheSetHelper::ALL
: 
 520                 if (P
->VersionList 
!= 0) 
 521                         for (V 
= P
.VersionList(); V
.end() != true; ++V
) 
 522                                 found 
|= vci
->insert(V
); 
 524                         helper
.canNotFindVersion(CacheSetHelper::ALL
, vci
, Cache
, P
); 
 526         case CacheSetHelper::CANDANDINST
: 
 527                 found 
|= vci
->insert(getInstalledVer(Cache
, P
, helper
)); 
 528                 found 
|= vci
->insert(getCandidateVer(Cache
, P
, helper
)); 
 530         case CacheSetHelper::CANDIDATE
: 
 531                 found 
|= vci
->insert(getCandidateVer(Cache
, P
, helper
)); 
 533         case CacheSetHelper::INSTALLED
: 
 534                 found 
|= vci
->insert(getInstalledVer(Cache
, P
, helper
)); 
 536         case CacheSetHelper::CANDINST
: 
 537                 showErrors 
= helper
.showErrors(false); 
 538                 V 
= getCandidateVer(Cache
, P
, helper
); 
 540                         V 
= getInstalledVer(Cache
, P
, helper
); 
 541                 helper
.showErrors(showErrors
); 
 542                 if (V
.end() == false) 
 543                         found 
|= vci
->insert(V
); 
 545                         helper
.canNotFindVersion(CacheSetHelper::CANDINST
, vci
, Cache
, P
); 
 547         case CacheSetHelper::INSTCAND
: 
 548                 showErrors 
= helper
.showErrors(false); 
 549                 V 
= getInstalledVer(Cache
, P
, helper
); 
 551                         V 
= getCandidateVer(Cache
, P
, helper
); 
 552                 helper
.showErrors(showErrors
); 
 553                 if (V
.end() == false) 
 554                         found 
|= vci
->insert(V
); 
 556                         helper
.canNotFindVersion(CacheSetHelper::INSTCAND
, vci
, Cache
, P
); 
 558         case CacheSetHelper::NEWEST
: 
 559                 if (P
->VersionList 
!= 0) 
 560                         found 
|= vci
->insert(P
.VersionList()); 
 562                         helper
.canNotFindVersion(CacheSetHelper::NEWEST
, vci
, Cache
, P
); 
 564         case CacheSetHelper::RELEASE
: 
 565         case CacheSetHelper::VERSIONNUMBER
: 
 566                 // both make no sense here, so always false 
 572 // FromDependency - versions satisfying a given dependency              /*{{{*/ 
 573 bool VersionContainerInterface::FromDependency(VersionContainerInterface 
* const vci
, 
 575                                                pkgCache::DepIterator 
const &D
, 
 576                                                CacheSetHelper::VerSelector 
const selector
, 
 577                                                CacheSetHelper 
&helper
) 
 581         case CacheSetHelper::ALL
: 
 583                 pkgCache::PkgIterator 
const T 
= D
.TargetPkg(); 
 584                 for (pkgCache::VerIterator Ver 
= T
.VersionList(); Ver
.end() == false; ++Ver
) 
 586                    if (D
.IsSatisfied(Ver
) == true) 
 591                    for (pkgCache::PrvIterator Prv 
= T
.ProvidesList(); Prv
.end() != true; ++Prv
) 
 593                       pkgCache::VerIterator 
const V 
= Prv
.OwnerVer(); 
 594                       if (unlikely(V
.end() == true) || D
.IsSatisfied(Prv
) == false) 
 602         case CacheSetHelper::CANDANDINST
: 
 604                 found 
= FromDependency(vci
, Cache
, D
, CacheSetHelper::CANDIDATE
, helper
); 
 605                 found 
&= FromDependency(vci
, Cache
, D
, CacheSetHelper::INSTALLED
, helper
); 
 608         case CacheSetHelper::CANDIDATE
: 
 610                 pkgCache::PkgIterator 
const T 
= D
.TargetPkg(); 
 611                 pkgCache::VerIterator 
const Cand 
= Cache
[T
].CandidateVerIter(Cache
); 
 612                 if (Cand
.end() == false && D
.IsSatisfied(Cand
) == true) 
 617                 for (pkgCache::PrvIterator Prv 
= T
.ProvidesList(); Prv
.end() != true; ++Prv
) 
 619                    pkgCache::VerIterator 
const V 
= Prv
.OwnerVer(); 
 620                    pkgCache::VerIterator 
const Cand 
= Cache
[Prv
.OwnerPkg()].CandidateVerIter(Cache
); 
 621                    if (Cand
.end() == true || V 
!= Cand 
|| D
.IsSatisfied(Prv
) == false) 
 628         case CacheSetHelper::INSTALLED
: 
 630                 pkgCache::PkgIterator 
const T 
= D
.TargetPkg(); 
 631                 pkgCache::VerIterator 
const Cand 
= T
.CurrentVer(); 
 632                 if (Cand
.end() == false && D
.IsSatisfied(Cand
) == true) 
 637                 for (pkgCache::PrvIterator Prv 
= T
.ProvidesList(); Prv
.end() != true; ++Prv
) 
 639                    pkgCache::VerIterator 
const V 
= Prv
.OwnerVer(); 
 640                    pkgCache::VerIterator 
const Cand 
= Prv
.OwnerPkg().CurrentVer(); 
 641                    if (Cand
.end() == true || V 
!= Cand 
|| D
.IsSatisfied(Prv
) == false) 
 648         case CacheSetHelper::CANDINST
: 
 649                 return FromDependency(vci
, Cache
, D
, CacheSetHelper::CANDIDATE
, helper
) || 
 650                    FromDependency(vci
, Cache
, D
, CacheSetHelper::INSTALLED
, helper
); 
 651         case CacheSetHelper::INSTCAND
: 
 652                 return FromDependency(vci
, Cache
, D
, CacheSetHelper::INSTALLED
, helper
) || 
 653                    FromDependency(vci
, Cache
, D
, CacheSetHelper::CANDIDATE
, helper
); 
 654         case CacheSetHelper::NEWEST
: 
 656                 pkgCache::PkgIterator 
const T 
= D
.TargetPkg(); 
 657                 pkgCache::VerIterator 
const Cand 
= T
.VersionList(); 
 658                 if (Cand
.end() == false && D
.IsSatisfied(Cand
) == true) 
 663                 for (pkgCache::PrvIterator Prv 
= T
.ProvidesList(); Prv
.end() != true; ++Prv
) 
 665                    pkgCache::VerIterator 
const V 
= Prv
.OwnerVer(); 
 666                    pkgCache::VerIterator 
const Cand 
= Prv
.OwnerPkg().VersionList(); 
 667                    if (Cand
.end() == true || V 
!= Cand 
|| D
.IsSatisfied(Prv
) == false) 
 674         case CacheSetHelper::RELEASE
: 
 675         case CacheSetHelper::VERSIONNUMBER
: 
 676                 // both make no sense here, so always false 
 682 // getCandidateVer - Returns the candidate version of the given package /*{{{*/ 
 683 pkgCache::VerIterator 
VersionContainerInterface::getCandidateVer(pkgCacheFile 
&Cache
, 
 684                 pkgCache::PkgIterator 
const &Pkg
, CacheSetHelper 
&helper
) { 
 685         pkgCache::VerIterator Cand
; 
 686         if (Cache
.IsDepCacheBuilt() == true) { 
 687                 Cand 
= Cache
[Pkg
].CandidateVerIter(Cache
); 
 688         } else if (unlikely(Cache
.GetPolicy() == nullptr)) { 
 689                 return pkgCache::VerIterator(Cache
); 
 691                 Cand 
= Cache
.GetPolicy()->GetCandidateVer(Pkg
); 
 693         if (Cand
.end() == true) 
 694                 return helper
.canNotGetVersion(CacheSetHelper::CANDIDATE
, Cache
, Pkg
); 
 698 // getInstalledVer - Returns the installed version of the given package /*{{{*/ 
 699 pkgCache::VerIterator 
VersionContainerInterface::getInstalledVer(pkgCacheFile 
&Cache
, 
 700                 pkgCache::PkgIterator 
const &Pkg
, CacheSetHelper 
&helper
) { 
 701         if (Pkg
->CurrentVer 
== 0) 
 702                 return helper
.canNotGetVersion(CacheSetHelper::INSTALLED
, Cache
, Pkg
); 
 703         return Pkg
.CurrentVer(); 
 707 // canNotFindPackage - with the given selector and pattern              /*{{{*/ 
 708 void CacheSetHelper::canNotFindPackage(enum PkgSelector 
const select
, 
 709       PackageContainerInterface 
* const pci
, pkgCacheFile 
&Cache
, 
 710       std::string 
const &pattern
) { 
 712 APT_IGNORE_DEPRECATED_PUSH
 
 713         case REGEX
: canNotFindRegEx(pci
, Cache
, pattern
); break; 
 714         case TASK
: canNotFindTask(pci
, Cache
, pattern
); break; 
 715         case FNMATCH
: canNotFindFnmatch(pci
, Cache
, pattern
); break; 
 716         case PACKAGENAME
: canNotFindPackage(pci
, Cache
, pattern
); break; 
 717         case STRING
: canNotFindPackage(pci
, Cache
, pattern
); break; 
 719 APT_IGNORE_DEPRECATED_POP
 
 722 // canNotFindTask - handle the case no package is found for a task      /*{{{*/ 
 723 void CacheSetHelper::canNotFindTask(PackageContainerInterface 
* const /*pci*/, pkgCacheFile 
&/*Cache*/, std::string pattern
) { 
 724         if (ShowError 
== true) 
 725                 _error
->Insert(ErrorType
, _("Couldn't find task '%s'"), pattern
.c_str()); 
 728 // canNotFindRegEx - handle the case no package is found by a regex     /*{{{*/ 
 729 void CacheSetHelper::canNotFindRegEx(PackageContainerInterface 
* const /*pci*/, pkgCacheFile 
&/*Cache*/, std::string pattern
) { 
 730         if (ShowError 
== true) 
 731                 _error
->Insert(ErrorType
, _("Couldn't find any package by regex '%s'"), pattern
.c_str()); 
 734 // canNotFindFnmatch - handle the case no package is found by a fnmatch /*{{{*/ 
 735    void CacheSetHelper::canNotFindFnmatch(PackageContainerInterface 
* const /*pci*/, pkgCacheFile 
&/*Cache*/, std::string pattern
) { 
 736         if (ShowError 
== true) 
 737                 _error
->Insert(ErrorType
, _("Couldn't find any package by glob '%s'"), pattern
.c_str()); 
 740 // canNotFindPackage - handle the case no package is found from a string/*{{{*/ 
 741 APT_CONST 
void CacheSetHelper::canNotFindPackage(PackageContainerInterface 
* const /*pci*/, pkgCacheFile 
&/*Cache*/, std::string 
const &/*str*/) { 
 745 // canNotFindPkgName - handle the case no package has this name         /*{{{*/ 
 746 pkgCache::PkgIterator 
CacheSetHelper::canNotFindPkgName(pkgCacheFile 
&Cache
, 
 747                         std::string 
const &str
) { 
 748         if (ShowError 
== true) 
 749                 _error
->Insert(ErrorType
, _("Unable to locate package %s"), str
.c_str()); 
 750         return pkgCache::PkgIterator(Cache
, 0); 
 753 // canNotFindVersion - for package by selector                          /*{{{*/ 
 754 void CacheSetHelper::canNotFindVersion(enum VerSelector 
const select
, VersionContainerInterface 
* const vci
, pkgCacheFile 
&Cache
, pkgCache::PkgIterator 
const &Pkg
) 
 757 APT_IGNORE_DEPRECATED_PUSH
 
 758         case ALL
: canNotFindAllVer(vci
, Cache
, Pkg
); break; 
 759         case INSTCAND
: canNotFindInstCandVer(vci
, Cache
, Pkg
); break; 
 760         case CANDINST
: canNotFindCandInstVer(vci
, Cache
, Pkg
); break; 
 761         case NEWEST
: canNotFindNewestVer(Cache
, Pkg
); break; 
 762         case CANDIDATE
: canNotFindCandidateVer(Cache
, Pkg
); break; 
 763         case INSTALLED
: canNotFindInstalledVer(Cache
, Pkg
); break; 
 764 APT_IGNORE_DEPRECATED_POP
 
 765         case CANDANDINST
: canNotGetCandInstVer(Cache
, Pkg
); break; 
 768                 // invalid in this branch 
 772 // canNotFindAllVer                                                     /*{{{*/ 
 773 void CacheSetHelper::canNotFindAllVer(VersionContainerInterface 
* const /*vci*/, pkgCacheFile 
&/*Cache*/, 
 774                 pkgCache::PkgIterator 
const &Pkg
) { 
 775         if (ShowError 
== true) 
 776                 _error
->Insert(ErrorType
, _("Can't select versions from package '%s' as it is purely virtual"), Pkg
.FullName(true).c_str()); 
 779 // canNotFindInstCandVer                                                /*{{{*/ 
 780 void CacheSetHelper::canNotFindInstCandVer(VersionContainerInterface 
* const /*vci*/, pkgCacheFile 
&Cache
, 
 781                 pkgCache::PkgIterator 
const &Pkg
) { 
 782         canNotGetInstCandVer(Cache
, Pkg
); 
 785 // canNotFindInstCandVer                                                /*{{{*/ 
 786 void CacheSetHelper::canNotFindCandInstVer(VersionContainerInterface 
* const /*vci*/, pkgCacheFile 
&Cache
, 
 787                 pkgCache::PkgIterator 
const &Pkg
) { 
 788         canNotGetCandInstVer(Cache
, Pkg
); 
 792 // canNotGetVersion - for package by selector                           /*{{{*/ 
 793 pkgCache::VerIterator 
CacheSetHelper::canNotGetVersion(enum VerSelector 
const select
, pkgCacheFile 
&Cache
, pkgCache::PkgIterator 
const &Pkg
) { 
 795 APT_IGNORE_DEPRECATED_PUSH
 
 796         case NEWEST
: return canNotFindNewestVer(Cache
, Pkg
); 
 797         case CANDIDATE
: return canNotFindCandidateVer(Cache
, Pkg
); 
 798         case INSTALLED
: return canNotFindInstalledVer(Cache
, Pkg
); 
 799 APT_IGNORE_DEPRECATED_POP
 
 800         case CANDINST
: return canNotGetCandInstVer(Cache
, Pkg
); 
 801         case INSTCAND
: return canNotGetInstCandVer(Cache
, Pkg
); 
 806                 // invalid in this branch 
 807                 return pkgCache::VerIterator(Cache
, 0); 
 809         return pkgCache::VerIterator(Cache
, 0); 
 811 // canNotFindNewestVer                                                  /*{{{*/ 
 812 pkgCache::VerIterator 
CacheSetHelper::canNotFindNewestVer(pkgCacheFile 
&Cache
, 
 813                 pkgCache::PkgIterator 
const &Pkg
) { 
 814         if (ShowError 
== true) 
 815                 _error
->Insert(ErrorType
, _("Can't select newest version from package '%s' as it is purely virtual"), Pkg
.FullName(true).c_str()); 
 816         return pkgCache::VerIterator(Cache
, 0); 
 819 // canNotFindCandidateVer                                               /*{{{*/ 
 820 pkgCache::VerIterator 
CacheSetHelper::canNotFindCandidateVer(pkgCacheFile 
&Cache
, 
 821                 pkgCache::PkgIterator 
const &Pkg
) { 
 822         if (ShowError 
== true) 
 823                 _error
->Insert(ErrorType
, _("Can't select candidate version from package %s as it has no candidate"), Pkg
.FullName(true).c_str()); 
 824         return pkgCache::VerIterator(Cache
, 0); 
 827 // canNotFindInstalledVer                                               /*{{{*/ 
 828 pkgCache::VerIterator 
CacheSetHelper::canNotFindInstalledVer(pkgCacheFile 
&Cache
, 
 829                 pkgCache::PkgIterator 
const &Pkg
) { 
 830         if (ShowError 
== true) 
 831                 _error
->Insert(ErrorType
, _("Can't select installed version from package %s as it is not installed"), Pkg
.FullName(true).c_str()); 
 832         return pkgCache::VerIterator(Cache
, 0); 
 835 // canNotFindInstCandVer                                                /*{{{*/ 
 836 pkgCache::VerIterator 
CacheSetHelper::canNotGetInstCandVer(pkgCacheFile 
&Cache
, 
 837                 pkgCache::PkgIterator 
const &Pkg
) { 
 838         if (ShowError 
== true) 
 839                 _error
->Insert(ErrorType
, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg
.FullName(true).c_str()); 
 840         return pkgCache::VerIterator(Cache
, 0); 
 843 // canNotFindInstCandVer                                                /*{{{*/ 
 844 pkgCache::VerIterator 
CacheSetHelper::canNotGetCandInstVer(pkgCacheFile 
&Cache
, 
 845                 pkgCache::PkgIterator 
const &Pkg
) { 
 846         if (ShowError 
== true) 
 847                 _error
->Insert(ErrorType
, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg
.FullName(true).c_str()); 
 848         return pkgCache::VerIterator(Cache
, 0); 
 852 // showPackageSelection - by selector and given pattern                 /*{{{*/ 
 853 void CacheSetHelper::showPackageSelection(pkgCache::PkgIterator 
const &pkg
, enum PkgSelector 
const select
, 
 854                                        std::string 
const &pattern
) { 
 856 APT_IGNORE_DEPRECATED_PUSH
 
 857         case REGEX
: showRegExSelection(pkg
, pattern
); break; 
 858         case TASK
: showTaskSelection(pkg
, pattern
); break; 
 859         case FNMATCH
: showFnmatchSelection(pkg
, pattern
); break; 
 860 APT_IGNORE_DEPRECATED_POP
 
 861         case PACKAGENAME
: /* no suprises here */ break; 
 862         case STRING
: /* handled by the special cases */ break; 
 866 // showTaskSelection                                                    /*{{{*/ 
 867 APT_CONST 
void CacheSetHelper::showTaskSelection(pkgCache::PkgIterator 
const &/*pkg*/, 
 868                                        std::string 
const &/*pattern*/) { 
 871 // showRegExSelection                                                   /*{{{*/ 
 872 APT_CONST 
void CacheSetHelper::showRegExSelection(pkgCache::PkgIterator 
const &/*pkg*/, 
 873                                         std::string 
const &/*pattern*/) { 
 876 // showFnmatchSelection                                                 /*{{{*/ 
 877 APT_CONST 
void CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator 
const &/*pkg*/, 
 878                                          std::string 
const &/*pattern*/) { 
 882 // showVersionSelection                                                 /*{{{*/ 
 883 void CacheSetHelper::showVersionSelection(pkgCache::PkgIterator 
const &Pkg
, 
 884       pkgCache::VerIterator 
const &Ver
, enum VerSelector 
const select
, std::string 
const &pattern
) { 
 886 APT_IGNORE_DEPRECATED_PUSH
 
 888                 showSelectedVersion(Pkg
, Ver
, pattern
, true); 
 891                 showSelectedVersion(Pkg
, Ver
, pattern
, false); 
 893 APT_IGNORE_DEPRECATED_POP
 
 901                 // not really suprises, but in fact: just not implemented 
 905 APT_CONST 
void CacheSetHelper::showSelectedVersion(pkgCache::PkgIterator 
const &/*Pkg*/, 
 906                                          pkgCache::VerIterator 
const /*Ver*/, 
 907                                          std::string 
const &/*ver*/, 
 908                                          bool const /*verIsRel*/) { 
 912 CacheSetHelper::CacheSetHelper(bool const ShowError
, GlobalError::MsgType ErrorType
) : 
 913    ShowError(ShowError
), ErrorType(ErrorType
), d(NULL
) {} 
 914 CacheSetHelper::~CacheSetHelper() {} 
 916 PackageContainerInterface::PackageContainerInterface() : ConstructedBy(CacheSetHelper::UNKNOWN
), d(NULL
) {} 
 917 PackageContainerInterface::PackageContainerInterface(CacheSetHelper::PkgSelector 
const by
) : ConstructedBy(by
), d(NULL
) {} 
 918 PackageContainerInterface
& PackageContainerInterface::operator=(PackageContainerInterface 
const &other
) { 
 920       this->ConstructedBy 
= other
.ConstructedBy
; 
 923 PackageContainerInterface::~PackageContainerInterface() {} 
 925 PackageUniverse::PackageUniverse(pkgCache 
* const Owner
) : _cont(Owner
), d(NULL
) {} 
 926 PackageUniverse::PackageUniverse(pkgCacheFile 
* const Owner
) : _cont(Owner
->GetPkgCache()), d(NULL
) {} 
 927 PackageUniverse::~PackageUniverse() {} 
 929 VersionContainerInterface::VersionContainerInterface() : d(NULL
) {} 
 930 VersionContainerInterface
& VersionContainerInterface::operator=(VersionContainerInterface 
const &) { 
 934 VersionContainerInterface::~VersionContainerInterface() {}