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(char const * const Question
, bool Default
) 
 655    auto const AssumeYes 
= _config
->FindB("APT::Get::Assume-Yes",false); 
 656    auto const AssumeNo 
= _config
->FindB("APT::Get::Assume-No",false); 
 657    // if we ask interactively, show warnings/notices before the question 
 658    if (AssumeYes 
== false && AssumeNo 
== false) 
 660       if (_config
->FindI("quiet",0) > 0) 
 661          _error
->DumpErrors(c2out
); 
 663          _error
->DumpErrors(c2out
, GlobalError::DEBUG
); 
 666    c2out 
<< Question 
<< std::flush
; 
 668    /* nl_langinfo does not support LANGUAGE setting, so we unset it here 
 669       to have the help-message (hopefully) match the expected characters */ 
 670    char * language 
= getenv("LANGUAGE"); 
 671    if (language 
!= NULL
) 
 672       language 
= strdup(language
); 
 673    if (language 
!= NULL
) 
 674       unsetenv("LANGUAGE"); 
 677       // TRANSLATOR: Yes/No question help-text: defaulting to Y[es] 
 678       //             e.g. "Do you want to continue? [Y/n] " 
 679       //             The user has to answer with an input matching the 
 680       //             YESEXPR/NOEXPR defined in your l10n. 
 681       c2out 
<< " " << _("[Y/n]") << " " << std::flush
; 
 683       // TRANSLATOR: Yes/No question help-text: defaulting to N[o] 
 684       //             e.g. "Should this file be removed? [y/N] " 
 685       //             The user has to answer with an input matching the 
 686       //             YESEXPR/NOEXPR defined in your l10n. 
 687       c2out 
<< " " << _("[y/N]") << " " << std::flush
; 
 689    if (language 
!= NULL
) 
 691       setenv("LANGUAGE", language
, 0); 
 697       // TRANSLATOR: "Yes" answer printed for a yes/no question if --assume-yes is set 
 698       c1out 
<< _("Y") << std::endl
; 
 703       // TRANSLATOR: "No" answer printed for a yes/no question if --assume-no is set 
 704       c1out 
<< _("N") << std::endl
; 
 708    char response
[1024] = ""; 
 709    std::cin
.getline(response
, sizeof(response
)); 
 714    if (strlen(response
) == 0) 
 720    Res 
= regcomp(&Pattern
, nl_langinfo(YESEXPR
), 
 721                  REG_EXTENDED
|REG_ICASE
|REG_NOSUB
); 
 725       regerror(Res
,&Pattern
,Error
,sizeof(Error
)); 
 726       return _error
->Error(_("Regex compilation error - %s"),Error
); 
 729    Res 
= regexec(&Pattern
, response
, 0, NULL
, 0); 
 735 // AnalPrompt - Annoying Yes No Prompt.                                 /*{{{*/ 
 736 // --------------------------------------------------------------------- 
 737 /* Returns true on a Yes.*/ 
 738 bool AnalPrompt(std::string 
const &Question
, const char *Text
) 
 740    if (_config
->FindI("quiet",0) > 0) 
 741       _error
->DumpErrors(c2out
); 
 743       _error
->DumpErrors(c2out
, GlobalError::DEBUG
); 
 744    c2out 
<< Question 
<< std::flush
; 
 747    std::cin
.getline(Buf
,sizeof(Buf
)); 
 748    if (strcmp(Buf
,Text
) == 0) 
 754 std::string 
PrettyFullName(pkgCache::PkgIterator 
const &Pkg
) 
 756    return Pkg
.FullName(true); 
 758 std::string 
CandidateVersion(pkgCacheFile 
* const Cache
, pkgCache::PkgIterator 
const &Pkg
) 
 760    return (*Cache
)[Pkg
].CandVersion
; 
 762 std::function
<std::string(pkgCache::PkgIterator 
const &)> CandidateVersion(pkgCacheFile 
* const Cache
) 
 764    return std::bind(static_cast<std::string(*)(pkgCacheFile 
* const, pkgCache::PkgIterator 
const&)>(&CandidateVersion
), Cache
, std::placeholders::_1
); 
 766 std::string 
CurrentToCandidateVersion(pkgCacheFile 
* const Cache
, pkgCache::PkgIterator 
const &Pkg
) 
 768    return std::string((*Cache
)[Pkg
].CurVersion
) + " => " + (*Cache
)[Pkg
].CandVersion
; 
 770 std::function
<std::string(pkgCache::PkgIterator 
const &)> CurrentToCandidateVersion(pkgCacheFile 
* const Cache
) 
 772    return std::bind(static_cast<std::string(*)(pkgCacheFile 
* const, pkgCache::PkgIterator 
const&)>(&CurrentToCandidateVersion
), Cache
, std::placeholders::_1
); 
 774 bool AlwaysTrue(pkgCache::PkgIterator 
const &) 
 778 std::string 
EmptyString(pkgCache::PkgIterator 
const &) 
 780    return std::string();