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 output
= SubstVar(output
, "${LongDescription}", GetLongDescription(CacheFile
, records
, P
));
294 output
= SubstVar(output
, "${ }${ }", "${ }");
295 output
= SubstVar(output
, "${ }\n", "\n");
296 output
= SubstVar(output
, "${ }", " ");
297 if (APT::String::Endswith(output
, " ") == true)
298 output
.erase(output
.length() - 1);
303 // ShowBroken - Debugging aide /*{{{*/
304 // ---------------------------------------------------------------------
305 /* This prints out the names of all the packages that are broken along
306 with the name of each each broken dependency and a quite version
309 The output looks like:
310 The following packages have unmet dependencies:
311 exim: Depends: libc6 (>= 2.1.94) but 2.1.3-10 is to be installed
312 Depends: libldap2 (>= 2.0.2-2) but it is not going to be installed
313 Depends: libsasl7 but it is not going to be installed
315 static void ShowBrokenPackage(ostream
&out
, pkgCacheFile
* const Cache
, pkgCache::PkgIterator
const &Pkg
, bool const Now
)
319 if ((*Cache
)[Pkg
].NowBroken() == false)
324 if ((*Cache
)[Pkg
].InstBroken() == false)
328 // Print out each package and the failed dependencies
329 out
<< " " << Pkg
.FullName(true) << " :";
330 unsigned const Indent
= Pkg
.FullName(true).size() + 3;
332 pkgCache::VerIterator Ver
;
335 Ver
= Pkg
.CurrentVer();
337 Ver
= (*Cache
)[Pkg
].InstVerIter(*Cache
);
339 if (Ver
.end() == true)
345 for (pkgCache::DepIterator D
= Ver
.DependsList(); D
.end() == false;)
347 // Compute a single dependency element (glob or)
348 pkgCache::DepIterator Start
;
349 pkgCache::DepIterator End
;
350 D
.GlobOr(Start
,End
); // advances D
352 if ((*Cache
)->IsImportantDep(End
) == false)
357 if (((*Cache
)[End
] & pkgDepCache::DepGNow
) == pkgDepCache::DepGNow
)
362 if (((*Cache
)[End
] & pkgDepCache::DepGInstall
) == pkgDepCache::DepGInstall
)
370 for (unsigned J
= 0; J
!= Indent
; J
++)
374 if (FirstOr
== false)
376 for (unsigned J
= 0; J
!= strlen(End
.DepType()) + 3; J
++)
380 out
<< ' ' << End
.DepType() << ": ";
383 out
<< Start
.TargetPkg().FullName(true);
385 // Show a quick summary of the version requirements
386 if (Start
.TargetVer() != 0)
387 out
<< " (" << Start
.CompType() << " " << Start
.TargetVer() << ")";
389 /* Show a summary of the target package if possible. In the case
390 of virtual packages we show nothing */
391 pkgCache::PkgIterator Targ
= Start
.TargetPkg();
392 if (Targ
->ProvidesList
== 0)
395 pkgCache::VerIterator Ver
= (*Cache
)[Targ
].InstVerIter(*Cache
);
397 Ver
= Targ
.CurrentVer();
399 if (Ver
.end() == false)
402 ioprintf(out
,_("but %s is installed"),Ver
.VerStr());
404 ioprintf(out
,_("but %s is to be installed"),Ver
.VerStr());
408 if ((*Cache
)[Targ
].CandidateVerIter(*Cache
).end() == true)
410 if (Targ
->ProvidesList
== 0)
411 out
<< _("but it is not installable");
413 out
<< _("but it is a virtual package");
416 out
<< (Now
?_("but it is not installed"):_("but it is not going to be installed"));
430 void ShowBroken(ostream
&out
, CacheFile
&Cache
, bool const Now
)
432 if (Cache
->BrokenCount() == 0)
435 out
<< _("The following packages have unmet dependencies:") << endl
;
436 SortedPackageUniverse
Universe(Cache
);
437 for (auto const &Pkg
: Universe
)
438 ShowBrokenPackage(out
, &Cache
, Pkg
, Now
);
440 void ShowBroken(ostream
&out
, pkgCacheFile
&Cache
, bool const Now
)
442 if (Cache
->BrokenCount() == 0)
445 out
<< _("The following packages have unmet dependencies:") << endl
;
446 APT::PackageUniverse
Universe(Cache
);
447 for (auto const &Pkg
: Universe
)
448 ShowBrokenPackage(out
, &Cache
, Pkg
, Now
);
451 // ShowNew - Show packages to newly install /*{{{*/
452 void ShowNew(ostream
&out
,CacheFile
&Cache
)
454 SortedPackageUniverse
Universe(Cache
);
455 ShowList(out
,_("The following NEW packages will be installed:"), Universe
,
456 [&Cache
](pkgCache::PkgIterator
const &Pkg
) { return Cache
[Pkg
].NewInstall(); },
458 CandidateVersion(&Cache
));
461 // ShowDel - Show packages to delete /*{{{*/
462 void ShowDel(ostream
&out
,CacheFile
&Cache
)
464 SortedPackageUniverse
Universe(Cache
);
465 ShowList(out
,_("The following packages will be REMOVED:"), Universe
,
466 [&Cache
](pkgCache::PkgIterator
const &Pkg
) { return Cache
[Pkg
].Delete(); },
467 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
469 std::string str
= PrettyFullName(Pkg
);
470 if (((*Cache
)[Pkg
].iFlags
& pkgDepCache::Purge
) == pkgDepCache::Purge
)
474 CandidateVersion(&Cache
));
477 // ShowKept - Show kept packages /*{{{*/
478 void ShowKept(ostream
&out
,CacheFile
&Cache
)
480 SortedPackageUniverse
Universe(Cache
);
481 ShowList(out
,_("The following packages have been kept back:"), Universe
,
482 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
484 return Cache
[Pkg
].Upgrade() == false &&
485 Cache
[Pkg
].Upgradable() == true &&
486 Pkg
->CurrentVer
!= 0 &&
487 Cache
[Pkg
].Delete() == false;
490 CurrentToCandidateVersion(&Cache
));
493 // ShowUpgraded - Show upgraded packages /*{{{*/
494 void ShowUpgraded(ostream
&out
,CacheFile
&Cache
)
496 SortedPackageUniverse
Universe(Cache
);
497 ShowList(out
,_("The following packages will be upgraded:"), Universe
,
498 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
500 return Cache
[Pkg
].Upgrade() == true && Cache
[Pkg
].NewInstall() == false;
503 CurrentToCandidateVersion(&Cache
));
506 // ShowDowngraded - Show downgraded packages /*{{{*/
507 // ---------------------------------------------------------------------
509 bool ShowDowngraded(ostream
&out
,CacheFile
&Cache
)
511 SortedPackageUniverse
Universe(Cache
);
512 return ShowList(out
,_("The following packages will be DOWNGRADED:"), Universe
,
513 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
515 return Cache
[Pkg
].Downgrade() == true && Cache
[Pkg
].NewInstall() == false;
518 CurrentToCandidateVersion(&Cache
));
521 // ShowHold - Show held but changed packages /*{{{*/
522 bool ShowHold(ostream
&out
,CacheFile
&Cache
)
524 SortedPackageUniverse
Universe(Cache
);
525 return ShowList(out
,_("The following held packages will be changed:"), Universe
,
526 [&Cache
](pkgCache::PkgIterator
const &Pkg
)
528 return Pkg
->SelectedState
== pkgCache::State::Hold
&&
529 Cache
[Pkg
].InstallVer
!= (pkgCache::Version
*)Pkg
.CurrentVer();
532 CurrentToCandidateVersion(&Cache
));
535 // ShowEssential - Show an essential package warning /*{{{*/
536 // ---------------------------------------------------------------------
537 /* This prints out a warning message that is not to be ignored. It shows
538 all essential packages and their dependents that are to be removed.
539 It is insanely risky to remove the dependents of an essential package! */
540 struct APT_HIDDEN PrettyFullNameWithDue
{
541 std::map
<unsigned long long, pkgCache::PkgIterator
> due
;
542 PrettyFullNameWithDue() {}
543 std::string
operator() (pkgCache::PkgIterator
const &Pkg
)
545 std::string
const A
= PrettyFullName(Pkg
);
546 std::map
<unsigned long long, pkgCache::PkgIterator
>::const_iterator d
= due
.find(Pkg
->ID
);
550 std::string
const B
= PrettyFullName(d
->second
);
551 std::ostringstream outstr
;
552 ioprintf(outstr
, _("%s (due to %s)"), A
.c_str(), B
.c_str());
556 bool ShowEssential(ostream
&out
,CacheFile
&Cache
)
558 std::vector
<bool> Added(Cache
->Head().PackageCount
, false);
559 APT::PackageDeque pkglist
;
560 PrettyFullNameWithDue withdue
;
562 SortedPackageUniverse
Universe(Cache
);
563 for (pkgCache::PkgIterator
const &I
: Universe
)
565 if ((I
->Flags
& pkgCache::Flag::Essential
) != pkgCache::Flag::Essential
&&
566 (I
->Flags
& pkgCache::Flag::Important
) != pkgCache::Flag::Important
)
569 // The essential package is being removed
570 if (Cache
[I
].Delete() == false)
573 if (Added
[I
->ID
] == false)
579 if (I
->CurrentVer
== 0)
582 // Print out any essential package depenendents that are to be removed
583 for (pkgCache::DepIterator D
= I
.CurrentVer().DependsList(); D
.end() == false; ++D
)
585 // Skip everything but depends
586 if (D
->Type
!= pkgCache::Dep::PreDepends
&&
587 D
->Type
!= pkgCache::Dep::Depends
)
590 pkgCache::PkgIterator P
= D
.SmartTargetPkg();
591 if (Cache
[P
].Delete() == true)
593 if (Added
[P
->ID
] == true)
598 withdue
.due
[P
->ID
] = I
;
602 return ShowList(out
,_("WARNING: The following essential packages will be removed.\n"
603 "This should NOT be done unless you know exactly what you are doing!"),
604 pkglist
, &AlwaysTrue
, withdue
, &EmptyString
);
607 // Stats - Show some statistics /*{{{*/
608 // ---------------------------------------------------------------------
610 void Stats(ostream
&out
,pkgDepCache
&Dep
)
612 unsigned long Upgrade
= 0;
613 unsigned long Downgrade
= 0;
614 unsigned long Install
= 0;
615 unsigned long ReInstall
= 0;
616 for (pkgCache::PkgIterator I
= Dep
.PkgBegin(); I
.end() == false; ++I
)
618 if (Dep
[I
].NewInstall() == true)
622 if (Dep
[I
].Upgrade() == true)
625 if (Dep
[I
].Downgrade() == true)
629 if (Dep
[I
].Delete() == false && (Dep
[I
].iFlags
& pkgDepCache::ReInstall
) == pkgDepCache::ReInstall
)
633 ioprintf(out
,_("%lu upgraded, %lu newly installed, "),
637 ioprintf(out
,_("%lu reinstalled, "),ReInstall
);
639 ioprintf(out
,_("%lu downgraded, "),Downgrade
);
641 ioprintf(out
,_("%lu to remove and %lu not upgraded.\n"),
642 Dep
.DelCount(),Dep
.KeepCount());
644 if (Dep
.BadCount() != 0)
645 ioprintf(out
,_("%lu not fully installed or removed.\n"),
649 // YnPrompt - Yes No Prompt. /*{{{*/
650 // ---------------------------------------------------------------------
651 /* Returns true on a Yes.*/
652 bool YnPrompt(bool Default
)
654 /* nl_langinfo does not support LANGUAGE setting, so we unset it here
655 to have the help-message (hopefully) match the expected characters */
656 char * language
= getenv("LANGUAGE");
657 if (language
!= NULL
)
658 language
= strdup(language
);
659 if (language
!= NULL
)
660 unsetenv("LANGUAGE");
663 // TRANSLATOR: Yes/No question help-text: defaulting to Y[es]
664 // e.g. "Do you want to continue? [Y/n] "
665 // The user has to answer with an input matching the
666 // YESEXPR/NOEXPR defined in your l10n.
667 c2out
<< " " << _("[Y/n]") << " " << std::flush
;
669 // TRANSLATOR: Yes/No question help-text: defaulting to N[o]
670 // e.g. "Should this file be removed? [y/N] "
671 // The user has to answer with an input matching the
672 // YESEXPR/NOEXPR defined in your l10n.
673 c2out
<< " " << _("[y/N]") << " " << std::flush
;
675 if (language
!= NULL
)
677 setenv("LANGUAGE", language
, 0);
681 if (_config
->FindB("APT::Get::Assume-Yes",false) == true)
683 // TRANSLATOR: "Yes" answer printed for a yes/no question if --assume-yes is set
684 c1out
<< _("Y") << std::endl
;
687 else if (_config
->FindB("APT::Get::Assume-No",false) == true)
689 // TRANSLATOR: "No" answer printed for a yes/no question if --assume-no is set
690 c1out
<< _("N") << std::endl
;
694 char response
[1024] = "";
695 std::cin
.getline(response
, sizeof(response
));
700 if (strlen(response
) == 0)
706 Res
= regcomp(&Pattern
, nl_langinfo(YESEXPR
),
707 REG_EXTENDED
|REG_ICASE
|REG_NOSUB
);
711 regerror(Res
,&Pattern
,Error
,sizeof(Error
));
712 return _error
->Error(_("Regex compilation error - %s"),Error
);
715 Res
= regexec(&Pattern
, response
, 0, NULL
, 0);
721 // AnalPrompt - Annoying Yes No Prompt. /*{{{*/
722 // ---------------------------------------------------------------------
723 /* Returns true on a Yes.*/
724 bool AnalPrompt(const char *Text
)
727 std::cin
.getline(Buf
,sizeof(Buf
));
728 if (strcmp(Buf
,Text
) == 0)
734 std::string
PrettyFullName(pkgCache::PkgIterator
const &Pkg
)
736 return Pkg
.FullName(true);
738 std::string
CandidateVersion(pkgCacheFile
* const Cache
, pkgCache::PkgIterator
const &Pkg
)
740 return (*Cache
)[Pkg
].CandVersion
;
742 std::function
<std::string(pkgCache::PkgIterator
const &)> CandidateVersion(pkgCacheFile
* const Cache
)
744 return std::bind(static_cast<std::string(*)(pkgCacheFile
* const, pkgCache::PkgIterator
const&)>(&CandidateVersion
), Cache
, std::placeholders::_1
);
746 std::string
CurrentToCandidateVersion(pkgCacheFile
* const Cache
, pkgCache::PkgIterator
const &Pkg
)
748 return std::string((*Cache
)[Pkg
].CurVersion
) + " => " + (*Cache
)[Pkg
].CandVersion
;
750 std::function
<std::string(pkgCache::PkgIterator
const &)> CurrentToCandidateVersion(pkgCacheFile
* const Cache
)
752 return std::bind(static_cast<std::string(*)(pkgCacheFile
* const, pkgCache::PkgIterator
const&)>(&CurrentToCandidateVersion
), Cache
, std::placeholders::_1
);
754 bool AlwaysTrue(pkgCache::PkgIterator
const &)
758 std::string
EmptyString(pkgCache::PkgIterator
const &)
760 return std::string();