1 // Include files /*{{{*/
4 #include <apt-pkg/configuration.h>
5 #include <apt-pkg/strutl.h>
6 #include <apt-pkg/error.h>
7 #include <apt-pkg/cachefile.h>
8 #include <apt-pkg/pkgrecords.h>
9 #include <apt-pkg/policy.h>
10 #include <apt-pkg/depcache.h>
11 #include <apt-pkg/pkgcache.h>
12 #include <apt-pkg/cacheiterators.h>
14 #include <apt-private/private-output.h>
15 #include <apt-private/private-cachefile.h>
26 #include <sys/ioctl.h>
35 std::ostream
c0out(0);
36 std::ostream
c1out(0);
37 std::ostream
c2out(0);
38 std::ofstream
devnull("/dev/null");
41 unsigned int ScreenWidth
= 80 - 1; /* - 1 for the cursor */
43 // SigWinch - Window size change signal handler /*{{{*/
44 // ---------------------------------------------------------------------
46 static void SigWinch(int)
52 if (ioctl(1, TIOCGWINSZ
, &ws
) != -1 && ws
.ws_col
>= 5)
53 ScreenWidth
= ws
.ws_col
- 1;
57 bool InitOutput(std::basic_streambuf
<char> * const out
) /*{{{*/
59 if (!isatty(STDOUT_FILENO
) && _config
->FindI("quiet", -1) == -1)
60 _config
->Set("quiet","1");
65 if (_config
->FindI("quiet",0) > 0)
66 c0out
.rdbuf(devnull
.rdbuf());
67 if (_config
->FindI("quiet",0) > 1)
68 c1out
.rdbuf(devnull
.rdbuf());
70 // deal with window size changes
71 signal(SIGWINCH
,SigWinch
);
76 _config
->Set("APT::Color", "false");
77 _config
->Set("APT::Color::Highlight", "");
78 _config
->Set("APT::Color::Neutral", "");
81 _config
->CndSet("APT::Color::Highlight", "\x1B[32m");
82 _config
->CndSet("APT::Color::Neutral", "\x1B[0m");
84 _config
->CndSet("APT::Color::Red", "\x1B[31m");
85 _config
->CndSet("APT::Color::Green", "\x1B[32m");
86 _config
->CndSet("APT::Color::Yellow", "\x1B[33m");
87 _config
->CndSet("APT::Color::Blue", "\x1B[34m");
88 _config
->CndSet("APT::Color::Magenta", "\x1B[35m");
89 _config
->CndSet("APT::Color::Cyan", "\x1B[36m");
90 _config
->CndSet("APT::Color::White", "\x1B[37m");
96 static std::string
GetArchiveSuite(pkgCacheFile
&/*CacheFile*/, pkgCache::VerIterator ver
) /*{{{*/
98 std::string suite
= "";
99 if (ver
&& ver
.FileList())
101 pkgCache::VerFileIterator VF
= ver
.FileList();
102 for (; VF
.end() == false ; ++VF
)
104 if(VF
.File() == NULL
|| VF
.File().Archive() == NULL
)
105 suite
= suite
+ "," + _("unknown");
107 suite
= suite
+ "," + VF
.File().Archive();
108 //suite = VF.File().Archive();
110 suite
= suite
.erase(0, 1);
115 static std::string
GetFlagsStr(pkgCacheFile
&CacheFile
, pkgCache::PkgIterator P
)/*{{{*/
117 pkgDepCache
*DepCache
= CacheFile
.GetDepCache();
118 pkgDepCache::StateCache
&state
= (*DepCache
)[P
];
120 std::string flags_str
;
121 if (state
.NowBroken())
123 if (P
.CurrentVer() && state
.Upgradable() && state
.CandidateVer
!= NULL
)
125 else if (P
.CurrentVer() != NULL
)
132 static std::string
GetCandidateVersion(pkgCacheFile
&CacheFile
, pkgCache::PkgIterator P
)/*{{{*/
134 pkgPolicy
*policy
= CacheFile
.GetPolicy();
135 pkgCache::VerIterator cand
= policy
->GetCandidateVer(P
);
137 return cand
? cand
.VerStr() : "(none)";
140 static std::string
GetInstalledVersion(pkgCacheFile
&/*CacheFile*/, pkgCache::PkgIterator P
)/*{{{*/
142 pkgCache::VerIterator inst
= P
.CurrentVer();
144 return inst
? inst
.VerStr() : "(none)";
147 static std::string
GetVersion(pkgCacheFile
&/*CacheFile*/, pkgCache::VerIterator V
)/*{{{*/
149 pkgCache::PkgIterator P
= V
.ParentPkg();
150 if (V
== P
.CurrentVer())
152 std::string inst_str
= DeNull(V
.VerStr());
153 #if 0 // FIXME: do we want this or something like this?
154 pkgDepCache
*DepCache
= CacheFile
.GetDepCache();
155 pkgDepCache::StateCache
&state
= (*DepCache
)[P
];
156 if (state
.Upgradable())
157 return "**"+inst_str
;
163 return DeNull(V
.VerStr());
167 static std::string
GetArchitecture(pkgCacheFile
&CacheFile
, pkgCache::PkgIterator P
)/*{{{*/
169 if (P
->CurrentVer
== 0)
171 pkgDepCache
* const DepCache
= CacheFile
.GetDepCache();
172 pkgDepCache::StateCache
const &state
= (*DepCache
)[P
];
173 if (state
.CandidateVer
!= NULL
)
175 pkgCache::VerIterator
const CandV(CacheFile
, state
.CandidateVer
);
180 pkgCache::VerIterator
const V
= P
.VersionList();
181 if (V
.end() == false)
188 return P
.CurrentVer().Arch();
191 static std::string
GetShortDescription(pkgCacheFile
&CacheFile
, pkgRecords
&records
, pkgCache::PkgIterator P
)/*{{{*/
193 pkgPolicy
*policy
= CacheFile
.GetPolicy();
195 pkgCache::VerIterator ver
;
197 ver
= P
.CurrentVer();
199 ver
= policy
->GetCandidateVer(P
);
201 std::string ShortDescription
= "(none)";
204 pkgCache::DescIterator
const Desc
= ver
.TranslatedDescription();
205 if (Desc
.end() == false)
207 pkgRecords::Parser
& parser
= records
.Lookup(Desc
.FileList());
208 ShortDescription
= parser
.ShortDesc();
211 return ShortDescription
;
214 static std::string
GetLongDescription(pkgCacheFile
&CacheFile
, pkgRecords
&records
, pkgCache::PkgIterator P
)/*{{{*/
216 pkgPolicy
*policy
= CacheFile
.GetPolicy();
218 pkgCache::VerIterator ver
;
219 if (P
->CurrentVer
!= 0)
220 ver
= P
.CurrentVer();
222 ver
= policy
->GetCandidateVer(P
);
224 std::string
const EmptyDescription
= "(none)";
225 if(ver
.end() == true)
226 return EmptyDescription
;
228 pkgCache::DescIterator
const Desc
= ver
.TranslatedDescription();
229 if (Desc
.end() == false)
231 pkgRecords::Parser
& parser
= records
.Lookup(Desc
.FileList());
232 std::string
const longdesc
= parser
.LongDesc();
233 if (longdesc
.empty() == false)
234 return SubstVar(longdesc
, "\n ", "\n ");
236 return EmptyDescription
;
239 void ListSingleVersion(pkgCacheFile
&CacheFile
, pkgRecords
&records
, /*{{{*/
240 pkgCache::VerIterator
const &V
, std::ostream
&out
,
241 std::string
const &format
)
243 pkgCache::PkgIterator
const P
= V
.ParentPkg();
244 pkgDepCache
* const DepCache
= CacheFile
.GetDepCache();
245 pkgDepCache::StateCache
const &state
= (*DepCache
)[P
];
248 if (_config
->FindB("APT::Cmd::use-format", false))
249 output
= _config
->Find("APT::Cmd::format", "${db::Status-Abbrev} ${Package} ${Version} ${Origin} ${Description}");
253 // FIXME: some of these names are really icky – and all is nowhere documented
254 output
= SubstVar(output
, "${db::Status-Abbrev}", GetFlagsStr(CacheFile
, P
));
255 output
= SubstVar(output
, "${Package}", P
.Name());
256 std::string
const ArchStr
= GetArchitecture(CacheFile
, P
);
257 output
= SubstVar(output
, "${Architecture}", ArchStr
);
258 std::string
const InstalledVerStr
= GetInstalledVersion(CacheFile
, P
);
259 output
= SubstVar(output
, "${installed:Version}", InstalledVerStr
);
260 std::string
const CandidateVerStr
= GetCandidateVersion(CacheFile
, P
);
261 output
= SubstVar(output
, "${candidate:Version}", CandidateVerStr
);
262 std::string
const VersionStr
= GetVersion(CacheFile
, V
);
263 output
= SubstVar(output
, "${Version}", VersionStr
);
264 output
= SubstVar(output
, "${Origin}", GetArchiveSuite(CacheFile
, V
));
266 std::string StatusStr
= "";
267 if (P
->CurrentVer
!= 0)
269 if (P
.CurrentVer() == V
)
271 if (state
.Upgradable() && state
.CandidateVer
!= NULL
)
272 strprintf(StatusStr
, _("[installed,upgradable to: %s]"),
273 CandidateVerStr
.c_str());
274 else if (V
.Downloadable() == false)
275 StatusStr
= _("[installed,local]");
276 else if(V
.Automatic() == true && state
.Garbage
== true)
277 StatusStr
= _("[installed,auto-removable]");
278 else if ((state
.Flags
& pkgCache::Flag::Auto
) == pkgCache::Flag::Auto
)
279 StatusStr
= _("[installed,automatic]");
281 StatusStr
= _("[installed]");
283 else if (state
.CandidateVer
== V
&& state
.Upgradable())
284 strprintf(StatusStr
, _("[upgradable from: %s]"),
285 InstalledVerStr
.c_str());
287 else if (V
.ParentPkg()->CurrentState
== pkgCache::State::ConfigFiles
)
288 StatusStr
= _("[residual-config]");
289 output
= SubstVar(output
, "${apt:Status}", StatusStr
);
290 output
= SubstVar(output
, "${color:highlight}", _config
->Find("APT::Color::Highlight", ""));
291 output
= SubstVar(output
, "${color:neutral}", _config
->Find("APT::Color::Neutral", ""));
292 output
= SubstVar(output
, "${Description}", GetShortDescription(CacheFile
, records
, P
));
293 if (output
.find("${LongDescription}") != string::npos
)
294 output
= SubstVar(output
, "${LongDescription}", GetLongDescription(CacheFile
, records
, P
));
295 output
= SubstVar(output
, "${ }${ }", "${ }");
296 output
= SubstVar(output
, "${ }\n", "\n");
297 output
= SubstVar(output
, "${ }", " ");
298 if (APT::String::Endswith(output
, " ") == true)
299 output
.erase(output
.length() - 1);
304 // ShowBroken - Debugging aide /*{{{*/
305 // ---------------------------------------------------------------------
306 /* This prints out the names of all the packages that are broken along
307 with the name of each each broken dependency and a quite version
310 The output looks like:
311 The following packages have unmet dependencies:
312 exim: Depends: libc6 (>= 2.1.94) but 2.1.3-10 is to be installed
313 Depends: libldap2 (>= 2.0.2-2) but it is not going to be installed
314 Depends: libsasl7 but it is not going to be installed
316 static void ShowBrokenPackage(ostream
&out
, pkgCacheFile
* const Cache
, pkgCache::PkgIterator
const &Pkg
, bool const Now
)
320 if ((*Cache
)[Pkg
].NowBroken() == false)
325 if ((*Cache
)[Pkg
].InstBroken() == false)
329 // Print out each package and the failed dependencies
330 out
<< " " << Pkg
.FullName(true) << " :";
331 unsigned const Indent
= Pkg
.FullName(true).size() + 3;
333 pkgCache::VerIterator Ver
;
336 Ver
= Pkg
.CurrentVer();
338 Ver
= (*Cache
)[Pkg
].InstVerIter(*Cache
);
340 if (Ver
.end() == true)
346 for (pkgCache::DepIterator D
= Ver
.DependsList(); D
.end() == false;)
348 // Compute a single dependency element (glob or)
349 pkgCache::DepIterator Start
;
350 pkgCache::DepIterator End
;
351 D
.GlobOr(Start
,End
); // advances D
353 if ((*Cache
)->IsImportantDep(End
) == false)
358 if (((*Cache
)[End
] & pkgDepCache::DepGNow
) == pkgDepCache::DepGNow
)
363 if (((*Cache
)[End
] & pkgDepCache::DepGInstall
) == pkgDepCache::DepGInstall
)
371 for (unsigned J
= 0; J
!= Indent
; J
++)
375 if (FirstOr
== false)
377 for (unsigned J
= 0; J
!= strlen(End
.DepType()) + 3; J
++)
381 out
<< ' ' << End
.DepType() << ": ";
384 out
<< Start
.TargetPkg().FullName(true);
386 // Show a quick summary of the version requirements
387 if (Start
.TargetVer() != 0)
388 out
<< " (" << Start
.CompType() << " " << Start
.TargetVer() << ")";
390 /* Show a summary of the target package if possible. In the case
391 of virtual packages we show nothing */
392 pkgCache::PkgIterator Targ
= Start
.TargetPkg();
393 if (Targ
->ProvidesList
== 0)
396 pkgCache::VerIterator Ver
= (*Cache
)[Targ
].InstVerIter(*Cache
);
398 Ver
= Targ
.CurrentVer();
400 if (Ver
.end() == false)
403 ioprintf(out
,_("but %s is installed"),Ver
.VerStr());
405 ioprintf(out
,_("but %s is to be installed"),Ver
.VerStr());
409 if ((*Cache
)[Targ
].CandidateVerIter(*Cache
).end() == true)
411 if (Targ
->ProvidesList
== 0)
412 out
<< _("but it is not installable");
414 out
<< _("but it is a virtual package");
417 out
<< (Now
?_("but it is not installed"):_("but it is not going to be installed"));
431 void ShowBroken(ostream
&out
, CacheFile
&Cache
, bool const Now
)
433 if (Cache
->BrokenCount() == 0)
436 out
<< _("The following packages have unmet dependencies:") << endl
;
437 SortedPackageUniverse
Universe(Cache
);
438 for (auto const &Pkg
: Universe
)
439 ShowBrokenPackage(out
, &Cache
, Pkg
, Now
);
441 void ShowBroken(ostream
&out
, pkgCacheFile
&Cache
, bool const Now
)
443 if (Cache
->BrokenCount() == 0)
446 out
<< _("The following packages have unmet dependencies:") << endl
;
447 APT::PackageUniverse
Universe(Cache
);
448 for (auto const &Pkg
: Universe
)
449 ShowBrokenPackage(out
, &Cache
, Pkg
, Now
);
452 // ShowNew - Show packages to newly install /*{{{*/
453 void ShowNew(ostream
&out
,CacheFile
&Cache
)
455 SortedPackageUniverse
Universe(Cache
);
456 ShowList(out
,_("The following NEW packages will be installed:"), Universe
,
457 [&Cache
](pkgCache::PkgIterator
const &Pkg
) { return Cache
[Pkg
].NewInstall(); },
459 CandidateVersion(&Cache
));
462 // ShowDel - Show packages to delete /*{{{*/
463 void ShowDel(ostream
&out
,CacheFile
&Cache
)
465 SortedPackageUniverse
Universe(Cache
);
466 ShowList(out
,_("The following packages will be REMOVED:"), Universe
,
467 [&Cache
](pkgCache::PkgIterator
const &Pkg
) { return Cache
[Pkg
].Delete(); },
468 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
470 std::string str
= PrettyFullName(Pkg
);
471 if (((*Cache
)[Pkg
].iFlags
& pkgDepCache::Purge
) == pkgDepCache::Purge
)
475 CandidateVersion(&Cache
));
478 // ShowKept - Show kept packages /*{{{*/
479 void ShowKept(ostream
&out
,CacheFile
&Cache
)
481 SortedPackageUniverse
Universe(Cache
);
482 ShowList(out
,_("The following packages have been kept back:"), Universe
,
483 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
485 return Cache
[Pkg
].Upgrade() == false &&
486 Cache
[Pkg
].Upgradable() == true &&
487 Pkg
->CurrentVer
!= 0 &&
488 Cache
[Pkg
].Delete() == false;
491 CurrentToCandidateVersion(&Cache
));
494 // ShowUpgraded - Show upgraded packages /*{{{*/
495 void ShowUpgraded(ostream
&out
,CacheFile
&Cache
)
497 SortedPackageUniverse
Universe(Cache
);
498 ShowList(out
,_("The following packages will be upgraded:"), Universe
,
499 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
501 return Cache
[Pkg
].Upgrade() == true && Cache
[Pkg
].NewInstall() == false;
504 CurrentToCandidateVersion(&Cache
));
507 // ShowDowngraded - Show downgraded packages /*{{{*/
508 // ---------------------------------------------------------------------
510 bool ShowDowngraded(ostream
&out
,CacheFile
&Cache
)
512 SortedPackageUniverse
Universe(Cache
);
513 return ShowList(out
,_("The following packages will be DOWNGRADED:"), Universe
,
514 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
516 return Cache
[Pkg
].Downgrade() == true && Cache
[Pkg
].NewInstall() == false;
519 CurrentToCandidateVersion(&Cache
));
522 // ShowHold - Show held but changed packages /*{{{*/
523 bool ShowHold(ostream
&out
,CacheFile
&Cache
)
525 SortedPackageUniverse
Universe(Cache
);
526 return ShowList(out
,_("The following held packages will be changed:"), Universe
,
527 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
529 return Pkg
->SelectedState
== pkgCache::State::Hold
&&
530 Cache
[Pkg
].InstallVer
!= (pkgCache::Version
*)Pkg
.CurrentVer();
533 CurrentToCandidateVersion(&Cache
));
536 // ShowEssential - Show an essential package warning /*{{{*/
537 // ---------------------------------------------------------------------
538 /* This prints out a warning message that is not to be ignored. It shows
539 all essential packages and their dependents that are to be removed.
540 It is insanely risky to remove the dependents of an essential package! */
541 struct APT_HIDDEN PrettyFullNameWithDue
{
542 std::map
<unsigned long long, pkgCache::PkgIterator
> due
;
543 PrettyFullNameWithDue() {}
544 std::string
operator() (pkgCache::PkgIterator
const &Pkg
)
546 std::string
const A
= PrettyFullName(Pkg
);
547 std::map
<unsigned long long, pkgCache::PkgIterator
>::const_iterator d
= due
.find(Pkg
->ID
);
551 std::string
const B
= PrettyFullName(d
->second
);
552 std::ostringstream outstr
;
553 ioprintf(outstr
, _("%s (due to %s)"), A
.c_str(), B
.c_str());
557 bool ShowEssential(ostream
&out
,CacheFile
&Cache
)
559 std::vector
<bool> Added(Cache
->Head().PackageCount
, false);
560 APT::PackageDeque pkglist
;
561 PrettyFullNameWithDue withdue
;
563 SortedPackageUniverse
Universe(Cache
);
564 for (pkgCache::PkgIterator
const &I
: Universe
)
566 if ((I
->Flags
& pkgCache::Flag::Essential
) != pkgCache::Flag::Essential
&&
567 (I
->Flags
& pkgCache::Flag::Important
) != pkgCache::Flag::Important
)
570 // The essential package is being removed
571 if (Cache
[I
].Delete() == false)
574 if (Added
[I
->ID
] == false)
580 if (I
->CurrentVer
== 0)
583 // Print out any essential package depenendents that are to be removed
584 for (pkgCache::DepIterator D
= I
.CurrentVer().DependsList(); D
.end() == false; ++D
)
586 // Skip everything but depends
587 if (D
->Type
!= pkgCache::Dep::PreDepends
&&
588 D
->Type
!= pkgCache::Dep::Depends
)
591 pkgCache::PkgIterator P
= D
.SmartTargetPkg();
592 if (Cache
[P
].Delete() == true)
594 if (Added
[P
->ID
] == true)
599 withdue
.due
[P
->ID
] = I
;
603 return ShowList(out
,_("WARNING: The following essential packages will be removed.\n"
604 "This should NOT be done unless you know exactly what you are doing!"),
605 pkglist
, &AlwaysTrue
, withdue
, &EmptyString
);
608 // Stats - Show some statistics /*{{{*/
609 // ---------------------------------------------------------------------
611 void Stats(ostream
&out
,pkgDepCache
&Dep
)
613 unsigned long Upgrade
= 0;
614 unsigned long Downgrade
= 0;
615 unsigned long Install
= 0;
616 unsigned long ReInstall
= 0;
617 for (pkgCache::PkgIterator I
= Dep
.PkgBegin(); I
.end() == false; ++I
)
619 if (Dep
[I
].NewInstall() == true)
623 if (Dep
[I
].Upgrade() == true)
626 if (Dep
[I
].Downgrade() == true)
630 if (Dep
[I
].Delete() == false && (Dep
[I
].iFlags
& pkgDepCache::ReInstall
) == pkgDepCache::ReInstall
)
634 ioprintf(out
,_("%lu upgraded, %lu newly installed, "),
638 ioprintf(out
,_("%lu reinstalled, "),ReInstall
);
640 ioprintf(out
,_("%lu downgraded, "),Downgrade
);
642 ioprintf(out
,_("%lu to remove and %lu not upgraded.\n"),
643 Dep
.DelCount(),Dep
.KeepCount());
645 if (Dep
.BadCount() != 0)
646 ioprintf(out
,_("%lu not fully installed or removed.\n"),
650 // YnPrompt - Yes No Prompt. /*{{{*/
651 // ---------------------------------------------------------------------
652 /* Returns true on a Yes.*/
653 bool YnPrompt(bool Default
)
655 /* nl_langinfo does not support LANGUAGE setting, so we unset it here
656 to have the help-message (hopefully) match the expected characters */
657 char * language
= getenv("LANGUAGE");
658 if (language
!= NULL
)
659 language
= strdup(language
);
660 if (language
!= NULL
)
661 unsetenv("LANGUAGE");
664 // TRANSLATOR: Yes/No question help-text: defaulting to Y[es]
665 // e.g. "Do you want to continue? [Y/n] "
666 // The user has to answer with an input matching the
667 // YESEXPR/NOEXPR defined in your l10n.
668 c2out
<< " " << _("[Y/n]") << " " << std::flush
;
670 // TRANSLATOR: Yes/No question help-text: defaulting to N[o]
671 // e.g. "Should this file be removed? [y/N] "
672 // The user has to answer with an input matching the
673 // YESEXPR/NOEXPR defined in your l10n.
674 c2out
<< " " << _("[y/N]") << " " << std::flush
;
676 if (language
!= NULL
)
678 setenv("LANGUAGE", language
, 0);
682 if (_config
->FindB("APT::Get::Assume-Yes",false) == true)
684 // TRANSLATOR: "Yes" answer printed for a yes/no question if --assume-yes is set
685 c1out
<< _("Y") << std::endl
;
688 else if (_config
->FindB("APT::Get::Assume-No",false) == true)
690 // TRANSLATOR: "No" answer printed for a yes/no question if --assume-no is set
691 c1out
<< _("N") << std::endl
;
695 char response
[1024] = "";
696 std::cin
.getline(response
, sizeof(response
));
701 if (strlen(response
) == 0)
707 Res
= regcomp(&Pattern
, nl_langinfo(YESEXPR
),
708 REG_EXTENDED
|REG_ICASE
|REG_NOSUB
);
712 regerror(Res
,&Pattern
,Error
,sizeof(Error
));
713 return _error
->Error(_("Regex compilation error - %s"),Error
);
716 Res
= regexec(&Pattern
, response
, 0, NULL
, 0);
722 // AnalPrompt - Annoying Yes No Prompt. /*{{{*/
723 // ---------------------------------------------------------------------
724 /* Returns true on a Yes.*/
725 bool AnalPrompt(const char *Text
)
728 std::cin
.getline(Buf
,sizeof(Buf
));
729 if (strcmp(Buf
,Text
) == 0)
735 std::string
PrettyFullName(pkgCache::PkgIterator
const &Pkg
)
737 return Pkg
.FullName(true);
739 std::string
CandidateVersion(pkgCacheFile
* const Cache
, pkgCache::PkgIterator
const &Pkg
)
741 return (*Cache
)[Pkg
].CandVersion
;
743 std::function
<std::string(pkgCache::PkgIterator
const &)> CandidateVersion(pkgCacheFile
* const Cache
)
745 return std::bind(static_cast<std::string(*)(pkgCacheFile
* const, pkgCache::PkgIterator
const&)>(&CandidateVersion
), Cache
, std::placeholders::_1
);
747 std::string
CurrentToCandidateVersion(pkgCacheFile
* const Cache
, pkgCache::PkgIterator
const &Pkg
)
749 return std::string((*Cache
)[Pkg
].CurVersion
) + " => " + (*Cache
)[Pkg
].CandVersion
;
751 std::function
<std::string(pkgCache::PkgIterator
const &)> CurrentToCandidateVersion(pkgCacheFile
* const Cache
)
753 return std::bind(static_cast<std::string(*)(pkgCacheFile
* const, pkgCache::PkgIterator
const&)>(&CurrentToCandidateVersion
), Cache
, std::placeholders::_1
);
755 bool AlwaysTrue(pkgCache::PkgIterator
const &)
759 std::string
EmptyString(pkgCache::PkgIterator
const &)
761 return std::string();