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/strutl.h>
20 #include <apt-pkg/versionmatch.h>
21 #include <apt-pkg/pkgrecords.h>
22 #include <apt-pkg/policy.h>
31 // FromTask - Return all packages in the cache from a specific task /*{{{*/
32 bool PackageContainerInterface::FromTask(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
, CacheSetHelper
&helper
) {
33 size_t const archfound
= pattern
.find_last_of(':');
34 std::string arch
= "native";
35 if (archfound
!= std::string::npos
) {
36 arch
= pattern
.substr(archfound
+1);
37 pattern
.erase(archfound
);
40 if (pattern
[pattern
.length() -1] != '^')
42 pattern
.erase(pattern
.length()-1);
44 if (unlikely(Cache
.GetPkgCache() == 0 || Cache
.GetDepCache() == 0))
47 bool const wasEmpty
= pci
->empty();
49 pci
->setConstructor(TASK
);
52 pkgRecords
Recs(Cache
);
54 // build regexp for the task
57 snprintf(S
, sizeof(S
), "^Task:.*[, ]%s([, ]|$)", pattern
.c_str());
58 if(regcomp(&Pattern
,S
, REG_EXTENDED
| REG_NOSUB
| REG_NEWLINE
) != 0) {
59 _error
->Error("Failed to compile task regexp");
64 for (pkgCache::GrpIterator Grp
= Cache
->GrpBegin(); Grp
.end() == false; ++Grp
) {
65 pkgCache::PkgIterator Pkg
= Grp
.FindPkg(arch
);
66 if (Pkg
.end() == true)
68 pkgCache::VerIterator ver
= Cache
[Pkg
].CandidateVerIter(Cache
);
72 pkgRecords::Parser
&parser
= Recs
.Lookup(ver
.FileList());
73 const char *start
, *end
;
74 parser
.GetRec(start
,end
);
75 unsigned int const length
= end
- start
;
76 if (unlikely(length
== 0))
79 strncpy(buf
, start
, length
);
81 if (regexec(&Pattern
, buf
, 0, 0, 0) != 0)
85 helper
.showTaskSelection(Pkg
, pattern
);
91 helper
.canNotFindTask(pci
, Cache
, pattern
);
92 pci
->setConstructor(UNKNOWN
);
96 if (wasEmpty
== false && pci
->getConstructor() != UNKNOWN
)
97 pci
->setConstructor(UNKNOWN
);
102 // FromRegEx - Return all packages in the cache matching a pattern /*{{{*/
103 bool PackageContainerInterface::FromRegEx(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
, CacheSetHelper
&helper
) {
104 static const char * const isregex
= ".?+*|[^$";
105 if (pattern
.find_first_of(isregex
) == std::string::npos
)
108 bool const wasEmpty
= pci
->empty();
109 if (wasEmpty
== true)
110 pci
->setConstructor(REGEX
);
112 size_t archfound
= pattern
.find_last_of(':');
113 std::string arch
= "native";
114 if (archfound
!= std::string::npos
) {
115 arch
= pattern
.substr(archfound
+1);
116 if (arch
.find_first_of(isregex
) == std::string::npos
)
117 pattern
.erase(archfound
);
122 if (unlikely(Cache
.GetPkgCache() == 0))
125 APT::CacheFilter::PackageNameMatchesRegEx
regexfilter(pattern
);
128 for (pkgCache::GrpIterator Grp
= Cache
.GetPkgCache()->GrpBegin(); Grp
.end() == false; ++Grp
) {
129 if (regexfilter(Grp
) == false)
131 pkgCache::PkgIterator Pkg
= Grp
.FindPkg(arch
);
132 if (Pkg
.end() == true) {
133 if (archfound
== std::string::npos
) {
134 std::vector
<std::string
> archs
= APT::Configuration::getArchitectures();
135 for (std::vector
<std::string
>::const_iterator a
= archs
.begin();
136 a
!= archs
.end() && Pkg
.end() != true; ++a
)
137 Pkg
= Grp
.FindPkg(*a
);
139 if (Pkg
.end() == true)
144 helper
.showRegExSelection(Pkg
, pattern
);
148 if (found
== false) {
149 helper
.canNotFindRegEx(pci
, Cache
, pattern
);
150 pci
->setConstructor(UNKNOWN
);
154 if (wasEmpty
== false && pci
->getConstructor() != UNKNOWN
)
155 pci
->setConstructor(UNKNOWN
);
160 // FromFnmatch - Returns the package defined by this fnmatch /*{{{*/
162 PackageContainerInterface::FromFnmatch(PackageContainerInterface
* const pci
,
165 CacheSetHelper
&helper
)
167 static const char * const isfnmatch
= ".?*[]!";
168 if (pattern
.find_first_of(isfnmatch
) == std::string::npos
)
171 bool const wasEmpty
= pci
->empty();
172 if (wasEmpty
== true)
173 pci
->setConstructor(FNMATCH
);
175 size_t archfound
= pattern
.find_last_of(':');
176 std::string arch
= "native";
177 if (archfound
!= std::string::npos
) {
178 arch
= pattern
.substr(archfound
+1);
179 if (arch
.find_first_of(isfnmatch
) == std::string::npos
)
180 pattern
.erase(archfound
);
185 if (unlikely(Cache
.GetPkgCache() == 0))
188 APT::CacheFilter::PackageNameMatchesFnmatch
filter(pattern
);
191 for (pkgCache::GrpIterator Grp
= Cache
.GetPkgCache()->GrpBegin(); Grp
.end() == false; ++Grp
) {
192 if (filter(Grp
) == false)
194 pkgCache::PkgIterator Pkg
= Grp
.FindPkg(arch
);
195 if (Pkg
.end() == true) {
196 if (archfound
== std::string::npos
) {
197 std::vector
<std::string
> archs
= APT::Configuration::getArchitectures();
198 for (std::vector
<std::string
>::const_iterator a
= archs
.begin();
199 a
!= archs
.end() && Pkg
.end() != true; ++a
)
200 Pkg
= Grp
.FindPkg(*a
);
202 if (Pkg
.end() == true)
207 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
208 helper
.showFnmatchSelection(Pkg
, pattern
);
210 helper
.showRegExSelection(Pkg
, pattern
);
215 if (found
== false) {
216 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
217 helper
.canNotFindFnmatch(pci
, Cache
, pattern
);
219 helper
.canNotFindRegEx(pci
, Cache
, pattern
);
221 pci
->setConstructor(UNKNOWN
);
225 if (wasEmpty
== false && pci
->getConstructor() != UNKNOWN
)
226 pci
->setConstructor(UNKNOWN
);
231 // FromName - Returns the package defined by this string /*{{{*/
232 pkgCache::PkgIterator
PackageContainerInterface::FromName(pkgCacheFile
&Cache
,
233 std::string
const &str
, CacheSetHelper
&helper
) {
234 std::string pkg
= str
;
235 size_t archfound
= pkg
.find_last_of(':');
237 if (archfound
!= std::string::npos
) {
238 arch
= pkg
.substr(archfound
+1);
239 pkg
.erase(archfound
);
242 if (Cache
.GetPkgCache() == 0)
243 return pkgCache::PkgIterator(Cache
, 0);
245 pkgCache::PkgIterator
Pkg(Cache
, 0);
246 if (arch
.empty() == true) {
247 pkgCache::GrpIterator Grp
= Cache
.GetPkgCache()->FindGrp(pkg
);
248 if (Grp
.end() == false)
249 Pkg
= Grp
.FindPreferredPkg();
251 Pkg
= Cache
.GetPkgCache()->FindPkg(pkg
, arch
);
253 if (Pkg
.end() == true)
254 return helper
.canNotFindPkgName(Cache
, str
);
258 // FromGroup - Returns the package defined by this string /*{{{*/
259 bool PackageContainerInterface::FromGroup(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
,
260 std::string pkg
, CacheSetHelper
&helper
) {
261 if (unlikely(Cache
.GetPkgCache() == 0))
264 size_t const archfound
= pkg
.find_last_of(':');
266 if (archfound
!= std::string::npos
) {
267 arch
= pkg
.substr(archfound
+1);
268 pkg
.erase(archfound
);
269 if (arch
== "all" || arch
== "native")
270 arch
= _config
->Find("APT::Architecture");
273 pkgCache::GrpIterator Grp
= Cache
.GetPkgCache()->FindGrp(pkg
);
274 if (Grp
.end() == false) {
275 if (arch
.empty() == true) {
276 pkgCache::PkgIterator Pkg
= Grp
.FindPreferredPkg();
277 if (Pkg
.end() == false)
284 // for 'linux-any' return the first package matching, for 'linux-*' return all matches
285 bool const isGlobal
= arch
.find('*') != std::string::npos
;
286 APT::CacheFilter::PackageArchitectureMatchesSpecification
pams(arch
);
287 for (pkgCache::PkgIterator Pkg
= Grp
.PackageList(); Pkg
.end() == false; Pkg
= Grp
.NextPkg(Pkg
)) {
288 if (pams(Pkg
) == false)
292 if (isGlobal
== false)
300 pkgCache::PkgIterator Pkg
= helper
.canNotFindPkgName(Cache
, pkg
);
301 if (Pkg
.end() == true)
308 // FromString - Return all packages matching a specific string /*{{{*/
309 bool PackageContainerInterface::FromString(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string
const &str
, CacheSetHelper
&helper
) {
311 _error
->PushToStack();
313 if (FromGroup(pci
, Cache
, str
, helper
) == false &&
314 FromTask(pci
, Cache
, str
, helper
) == false &&
315 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
316 FromFnmatch(pci
, Cache
, str
, helper
) == false)
318 FromRegEx(pci
, Cache
, str
, helper
) == false)
320 helper
.canNotFindPackage(pci
, Cache
, str
);
325 _error
->RevertToStack();
327 _error
->MergeWithStack();
331 // FromCommandLine - Return all packages specified on commandline /*{{{*/
332 bool PackageContainerInterface::FromCommandLine(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, const char **cmdline
, CacheSetHelper
&helper
) {
334 for (const char **I
= cmdline
; *I
!= 0; ++I
)
335 found
|= PackageContainerInterface::FromString(pci
, Cache
, *I
, helper
);
339 // FromModifierCommandLine - helper doing the work for PKG:GroupedFromCommandLine /*{{{*/
340 bool PackageContainerInterface::FromModifierCommandLine(unsigned short &modID
, PackageContainerInterface
* const pci
,
341 pkgCacheFile
&Cache
, const char * cmdline
,
342 std::list
<Modifier
> const &mods
, CacheSetHelper
&helper
) {
343 std::string str
= cmdline
;
344 unsigned short fallback
= modID
;
345 bool modifierPresent
= false;
346 for (std::list
<Modifier
>::const_iterator mod
= mods
.begin();
347 mod
!= mods
.end(); ++mod
) {
348 size_t const alength
= strlen(mod
->Alias
);
350 case Modifier::POSTFIX
:
351 if (str
.compare(str
.length() - alength
, alength
,
352 mod
->Alias
, 0, alength
) != 0)
354 str
.erase(str
.length() - alength
);
357 case Modifier::PREFIX
:
362 modifierPresent
= true;
365 if (modifierPresent
== true) {
366 bool const errors
= helper
.showErrors(false);
367 pkgCache::PkgIterator Pkg
= FromName(Cache
, cmdline
, helper
);
368 helper
.showErrors(errors
);
369 if (Pkg
.end() == false) {
375 return FromString(pci
, Cache
, str
, helper
);
378 // FromModifierCommandLine - helper doing the work for VER:GroupedFromCommandLine /*{{{*/
379 bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID
,
380 VersionContainerInterface
* const vci
,
381 pkgCacheFile
&Cache
, const char * cmdline
,
382 std::list
<Modifier
> const &mods
,
383 CacheSetHelper
&helper
) {
384 Version select
= NEWEST
;
385 std::string str
= cmdline
;
386 bool modifierPresent
= false;
387 unsigned short fallback
= modID
;
388 for (std::list
<Modifier
>::const_iterator mod
= mods
.begin();
389 mod
!= mods
.end(); ++mod
) {
390 if (modID
== fallback
&& mod
->ID
== fallback
)
391 select
= mod
->SelectVersion
;
392 size_t const alength
= strlen(mod
->Alias
);
394 case Modifier::POSTFIX
:
395 if (str
.compare(str
.length() - alength
, alength
,
396 mod
->Alias
, 0, alength
) != 0)
398 str
.erase(str
.length() - alength
);
400 select
= mod
->SelectVersion
;
402 case Modifier::PREFIX
:
407 modifierPresent
= true;
410 if (modifierPresent
== true) {
411 bool const errors
= helper
.showErrors(false);
412 bool const found
= VersionContainerInterface::FromString(vci
, Cache
, cmdline
, select
, helper
, true);
413 helper
.showErrors(errors
);
419 return FromString(vci
, Cache
, str
, select
, helper
);
422 // FromCommandLine - Return all versions specified on commandline /*{{{*/
423 bool VersionContainerInterface::FromCommandLine(VersionContainerInterface
* const vci
,
424 pkgCacheFile
&Cache
, const char **cmdline
,
425 Version
const &fallback
, CacheSetHelper
&helper
) {
427 for (const char **I
= cmdline
; *I
!= 0; ++I
)
428 found
|= VersionContainerInterface::FromString(vci
, Cache
, *I
, fallback
, helper
);
432 // FromString - Returns all versions spedcified by a string /*{{{*/
433 bool VersionContainerInterface::FromString(VersionContainerInterface
* const vci
,
434 pkgCacheFile
&Cache
, std::string pkg
,
435 Version
const &fallback
, CacheSetHelper
&helper
,
436 bool const onlyFromName
) {
438 bool verIsRel
= false;
439 size_t const vertag
= pkg
.find_last_of("/=");
440 if (vertag
!= std::string::npos
) {
441 ver
= pkg
.substr(vertag
+1);
442 verIsRel
= (pkg
[vertag
] == '/');
446 if (onlyFromName
== false)
447 PackageContainerInterface::FromString(&pkgset
, Cache
, pkg
, helper
);
449 pkgset
.insert(PackageContainerInterface::FromName(Cache
, pkg
, helper
));
453 if (pkgset
.getConstructor() != PackageSet::UNKNOWN
)
454 errors
= helper
.showErrors(false);
457 for (PackageSet::const_iterator P
= pkgset
.begin();
458 P
!= pkgset
.end(); ++P
) {
459 if (vertag
== std::string::npos
) {
460 found
|= VersionContainerInterface::FromPackage(vci
, Cache
, P
, fallback
, helper
);
463 pkgCache::VerIterator V
;
464 if (ver
== "installed")
465 V
= getInstalledVer(Cache
, P
, helper
);
466 else if (ver
== "candidate")
467 V
= getCandidateVer(Cache
, P
, helper
);
468 else if (ver
== "newest") {
469 if (P
->VersionList
!= 0)
472 V
= helper
.canNotFindNewestVer(Cache
, P
);
474 pkgVersionMatch
Match(ver
, (verIsRel
== true ? pkgVersionMatch::Release
:
475 pkgVersionMatch::Version
));
477 if (V
.end() == true) {
478 if (verIsRel
== true)
479 _error
->Error(_("Release '%s' for '%s' was not found"),
480 ver
.c_str(), P
.FullName(true).c_str());
482 _error
->Error(_("Version '%s' for '%s' was not found"),
483 ver
.c_str(), P
.FullName(true).c_str());
489 helper
.showSelectedVersion(P
, V
, ver
, verIsRel
);
493 if (pkgset
.getConstructor() != PackageSet::UNKNOWN
)
494 helper
.showErrors(errors
);
498 // FromPackage - versions from package based on fallback /*{{{*/
499 bool VersionContainerInterface::FromPackage(VersionContainerInterface
* const vci
,
501 pkgCache::PkgIterator
const &P
,
502 Version
const &fallback
,
503 CacheSetHelper
&helper
) {
504 pkgCache::VerIterator V
;
509 if (P
->VersionList
!= 0)
510 for (V
= P
.VersionList(); V
.end() != true; ++V
)
511 found
|= vci
->insert(V
);
513 helper
.canNotFindAllVer(vci
, Cache
, P
);
516 found
|= vci
->insert(getInstalledVer(Cache
, P
, helper
));
517 found
|= vci
->insert(getCandidateVer(Cache
, P
, helper
));
520 found
|= vci
->insert(getCandidateVer(Cache
, P
, helper
));
523 found
|= vci
->insert(getInstalledVer(Cache
, P
, helper
));
526 showErrors
= helper
.showErrors(false);
527 V
= getCandidateVer(Cache
, P
, helper
);
529 V
= getInstalledVer(Cache
, P
, helper
);
530 helper
.showErrors(showErrors
);
531 if (V
.end() == false)
532 found
|= vci
->insert(V
);
534 helper
.canNotFindInstCandVer(vci
, Cache
, P
);
537 showErrors
= helper
.showErrors(false);
538 V
= getInstalledVer(Cache
, P
, helper
);
540 V
= getCandidateVer(Cache
, P
, helper
);
541 helper
.showErrors(showErrors
);
542 if (V
.end() == false)
543 found
|= vci
->insert(V
);
545 helper
.canNotFindInstCandVer(vci
, Cache
, P
);
548 if (P
->VersionList
!= 0)
549 found
|= vci
->insert(P
.VersionList());
551 helper
.canNotFindNewestVer(Cache
, P
);
557 // getCandidateVer - Returns the candidate version of the given package /*{{{*/
558 pkgCache::VerIterator
VersionContainerInterface::getCandidateVer(pkgCacheFile
&Cache
,
559 pkgCache::PkgIterator
const &Pkg
, CacheSetHelper
&helper
) {
560 pkgCache::VerIterator Cand
;
561 if (Cache
.IsPolicyBuilt() == true || Cache
.IsDepCacheBuilt() == false) {
562 if (unlikely(Cache
.GetPolicy() == 0))
563 return pkgCache::VerIterator(Cache
);
564 Cand
= Cache
.GetPolicy()->GetCandidateVer(Pkg
);
566 Cand
= Cache
[Pkg
].CandidateVerIter(Cache
);
568 if (Cand
.end() == true)
569 return helper
.canNotFindCandidateVer(Cache
, Pkg
);
573 // getInstalledVer - Returns the installed version of the given package /*{{{*/
574 pkgCache::VerIterator
VersionContainerInterface::getInstalledVer(pkgCacheFile
&Cache
,
575 pkgCache::PkgIterator
const &Pkg
, CacheSetHelper
&helper
) {
576 if (Pkg
->CurrentVer
== 0)
577 return helper
.canNotFindInstalledVer(Cache
, Pkg
);
578 return Pkg
.CurrentVer();
582 // canNotFindPkgName - handle the case no package has this name /*{{{*/
583 pkgCache::PkgIterator
CacheSetHelper::canNotFindPkgName(pkgCacheFile
&Cache
,
584 std::string
const &str
) {
585 if (ShowError
== true)
586 _error
->Insert(ErrorType
, _("Unable to locate package %s"), str
.c_str());
587 return pkgCache::PkgIterator(Cache
, 0);
590 // canNotFindTask - handle the case no package is found for a task /*{{{*/
591 void CacheSetHelper::canNotFindTask(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
) {
592 if (ShowError
== true)
593 _error
->Insert(ErrorType
, _("Couldn't find task '%s'"), pattern
.c_str());
596 // canNotFindRegEx - handle the case no package is found by a regex /*{{{*/
597 void CacheSetHelper::canNotFindRegEx(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
) {
598 if (ShowError
== true)
599 _error
->Insert(ErrorType
, _("Couldn't find any package by regex '%s'"), pattern
.c_str());
601 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
602 // canNotFindFnmatch - handle the case no package is found by a fnmatch /*{{{*/
603 void CacheSetHelper::canNotFindFnmatch(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
) {
604 if (ShowError
== true)
605 _error
->Insert(ErrorType
, _("Couldn't find any package by glob '%s'"), pattern
.c_str());
608 // canNotFindPackage - handle the case no package is found from a string/*{{{*/
609 void CacheSetHelper::canNotFindPackage(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string
const &str
) {
612 // canNotFindAllVer /*{{{*/
613 void CacheSetHelper::canNotFindAllVer(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
614 pkgCache::PkgIterator
const &Pkg
) {
615 if (ShowError
== true)
616 _error
->Insert(ErrorType
, _("Can't select versions from package '%s' as it is purely virtual"), Pkg
.FullName(true).c_str());
619 // canNotFindInstCandVer /*{{{*/
620 void CacheSetHelper::canNotFindInstCandVer(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
621 pkgCache::PkgIterator
const &Pkg
) {
622 if (ShowError
== true)
623 _error
->Insert(ErrorType
, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg
.FullName(true).c_str());
626 // canNotFindInstCandVer /*{{{*/
627 void CacheSetHelper::canNotFindCandInstVer(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
628 pkgCache::PkgIterator
const &Pkg
) {
629 if (ShowError
== true)
630 _error
->Insert(ErrorType
, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg
.FullName(true).c_str());
633 // canNotFindNewestVer /*{{{*/
634 pkgCache::VerIterator
CacheSetHelper::canNotFindNewestVer(pkgCacheFile
&Cache
,
635 pkgCache::PkgIterator
const &Pkg
) {
636 if (ShowError
== true)
637 _error
->Insert(ErrorType
, _("Can't select newest version from package '%s' as it is purely virtual"), Pkg
.FullName(true).c_str());
638 return pkgCache::VerIterator(Cache
, 0);
641 // canNotFindCandidateVer /*{{{*/
642 pkgCache::VerIterator
CacheSetHelper::canNotFindCandidateVer(pkgCacheFile
&Cache
,
643 pkgCache::PkgIterator
const &Pkg
) {
644 if (ShowError
== true)
645 _error
->Insert(ErrorType
, _("Can't select candidate version from package %s as it has no candidate"), Pkg
.FullName(true).c_str());
646 return pkgCache::VerIterator(Cache
, 0);
649 // canNotFindInstalledVer /*{{{*/
650 pkgCache::VerIterator
CacheSetHelper::canNotFindInstalledVer(pkgCacheFile
&Cache
,
651 pkgCache::PkgIterator
const &Pkg
) {
652 if (ShowError
== true)
653 _error
->Insert(ErrorType
, _("Can't select installed version from package %s as it is not installed"), Pkg
.FullName(true).c_str());
654 return pkgCache::VerIterator(Cache
, 0);
657 // showTaskSelection /*{{{*/
658 void CacheSetHelper::showTaskSelection(pkgCache::PkgIterator
const &pkg
,
659 std::string
const &pattern
) {
662 // showRegExSelection /*{{{*/
663 void CacheSetHelper::showRegExSelection(pkgCache::PkgIterator
const &pkg
,
664 std::string
const &pattern
) {
667 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
668 // showFnmatchSelection /*{{{*/
669 void CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator
const &pkg
,
670 std::string
const &pattern
) {
674 // showSelectedVersion /*{{{*/
675 void CacheSetHelper::showSelectedVersion(pkgCache::PkgIterator
const &Pkg
,
676 pkgCache::VerIterator
const Ver
,
677 std::string
const &ver
,
678 bool const verIsRel
) {