]>
git.saurik.com Git - apt.git/blob - cmdline/apt-get.cc
9749913a761b27fcbe7cc2755d94cb2fbc781efc
   1 // -*- mode: cpp; mode: fold -*- 
   3 // $Id: apt-get.cc,v 1.32 1998/12/31 01:32:20 jgg Exp $ 
   4 /* ###################################################################### 
   6    apt-get - Cover for dpkg 
   8    This is an allout cover for dpkg implementing a safer front end. It is 
   9    based largely on libapt-pkg. 
  11    The syntax is different,  
  12       apt-get [opt] command [things] 
  14       update - Resyncronize the package files from their sources 
  15       upgrade - Smart-Download the newest versions of all packages 
  16       dselect-upgrade - Follows dselect's changes to the Status: field 
  17                        and installes new and removes old packages 
  18       dist-upgrade - Powerfull upgrader designed to handle the issues with 
  20       install - Download and install a given package (by name, not by .deb) 
  21       check - Update the package cache and check for broken packages 
  22       clean - Erase the .debs downloaded to /var/cache/apt/archives and 
  25    ##################################################################### */ 
  27 // Include Files                                                        /*{{{*/ 
  28 #include <apt-pkg/error.h> 
  29 #include <apt-pkg/cmndline.h> 
  30 #include <apt-pkg/init.h> 
  31 #include <apt-pkg/depcache.h> 
  32 #include <apt-pkg/sourcelist.h> 
  33 #include <apt-pkg/pkgcachegen.h> 
  34 #include <apt-pkg/algorithms.h> 
  35 #include <apt-pkg/acquire-item.h> 
  36 #include <apt-pkg/dpkgpm.h> 
  37 #include <apt-pkg/dpkginit.h> 
  42 #include "acqprogress.h" 
  46 #include <sys/ioctl.h> 
  54 ofstream 
devnull("/dev/null"); 
  55 unsigned int ScreenWidth 
= 80; 
  57 // YnPrompt - Yes No Prompt.                                            /*{{{*/ 
  58 // --------------------------------------------------------------------- 
  59 /* Returns true on a Yes.*/ 
  62    if (_config
->FindB("APT::Get::Assume-Yes",false) == true) 
  70    read(STDIN_FILENO
,&C
,1); 
  71    while (C 
!= '\n' && Jnk 
!= '\n') read(STDIN_FILENO
,&Jnk
,1); 
  73    if (!(C 
== 'Y' || C 
== 'y' || C 
== '\n' || C 
== '\r')) 
  78 // ShowList - Show a list                                               /*{{{*/ 
  79 // --------------------------------------------------------------------- 
  80 /* This prints out a string of space seperated words with a title and  
  81    a two space indent line wraped to the current screen width. */ 
  82 bool ShowList(ostream 
&out
,string Title
,string List
) 
  84    if (List
.empty() == true) 
  87    // Acount for the leading space 
  88    int ScreenWidth 
= ::ScreenWidth 
- 3; 
  91    string::size_type Start 
= 0; 
  92    while (Start 
< List
.size()) 
  94       string::size_type End
; 
  95       if (Start 
+ ScreenWidth 
>= List
.size()) 
  98          End 
= List
.rfind(' ',Start
+ScreenWidth
); 
 100       if (End 
== string::npos 
|| End 
< Start
) 
 101          End 
= Start 
+ ScreenWidth
; 
 102       out 
<< "  " << string(List
,Start
,End 
- Start
) << endl
; 
 108 // ShowBroken - Debugging aide                                          /*{{{*/ 
 109 // --------------------------------------------------------------------- 
 110 /* This prints out the names of all the packages that are broken along 
 111    with the name of each each broken dependency and a quite version  
 113 void ShowBroken(ostream 
&out
,pkgDepCache 
&Cache
) 
 115    out 
<< "Sorry, but the following packages have unmet dependencies:" << endl
; 
 116    pkgCache::PkgIterator I 
= Cache
.PkgBegin(); 
 117    for (;I
.end() != true; I
++) 
 119       if (Cache
[I
].InstBroken() == false) 
 122       // Print out each package and the failed dependencies 
 123       out 
<<"  " <<  I
.Name() << ":"; 
 124       int Indent 
= strlen(I
.Name()) + 3; 
 126       if (Cache
[I
].InstVerIter(Cache
).end() == true) 
 132       for (pkgCache::DepIterator D 
= Cache
[I
].InstVerIter(Cache
).DependsList(); D
.end() == false;) 
 134          // Compute a single dependency element (glob or) 
 135          pkgCache::DepIterator Start
; 
 136          pkgCache::DepIterator End
; 
 139          if (Cache
.IsImportantDep(End
) == false ||  
 140              (Cache
[End
] & pkgDepCache::DepGInstall
) == pkgDepCache::DepGInstall
) 
 144             for (int J 
= 0; J 
!= Indent
; J
++) 
 148          cout 
<< ' ' << End
.DepType() << ": " << End
.TargetPkg().Name(); 
 150          // Show a quick summary of the version requirements 
 151          if (End
.TargetVer() != 0) 
 152             out 
<< " (" << End
.CompType() << " " << End
.TargetVer() <<  
 155          /* Show a summary of the target package if possible. In the case 
 156           of virtual packages we show nothing */ 
 158          pkgCache::PkgIterator Targ 
= End
.TargetPkg(); 
 159          if (Targ
->ProvidesList 
== 0) 
 162             pkgCache::VerIterator Ver 
= Cache
[Targ
].InstVerIter(Cache
); 
 163             if (Ver
.end() == false) 
 164                out 
<< Ver
.VerStr() << " is installed"; 
 167                if (Cache
[Targ
].CandidateVerIter(Cache
).end() == true) 
 169                   if (Targ
->ProvidesList 
== 0) 
 170                      out 
<< "it is not installable"; 
 172                      out 
<< "it is a virtual package"; 
 175                   out 
<< "it is not installed"; 
 184 // ShowNew - Show packages to newly install                             /*{{{*/ 
 185 // --------------------------------------------------------------------- 
 187 void ShowNew(ostream 
&out
,pkgDepCache 
&Dep
) 
 189    /* Print out a list of packages that are going to be removed extra 
 190       to what the user asked */ 
 191    pkgCache::PkgIterator I 
= Dep
.PkgBegin(); 
 193    for (;I
.end() != true; I
++) 
 194       if (Dep
[I
].NewInstall() == true) 
 195          List 
+= string(I
.Name()) + " "; 
 196    ShowList(out
,"The following NEW packages will be installed:",List
); 
 199 // ShowDel - Show packages to delete                                    /*{{{*/ 
 200 // --------------------------------------------------------------------- 
 202 void ShowDel(ostream 
&out
,pkgDepCache 
&Dep
) 
 204    /* Print out a list of packages that are going to be removed extra 
 205       to what the user asked */ 
 206    pkgCache::PkgIterator I 
= Dep
.PkgBegin(); 
 208    for (;I
.end() != true; I
++) 
 209       if (Dep
[I
].Delete() == true) 
 210          List 
+= string(I
.Name()) + " "; 
 212    ShowList(out
,"The following packages will be REMOVED:",List
); 
 215 // ShowKept - Show kept packages                                        /*{{{*/ 
 216 // --------------------------------------------------------------------- 
 218 void ShowKept(ostream 
&out
,pkgDepCache 
&Dep
) 
 220    pkgCache::PkgIterator I 
= Dep
.PkgBegin(); 
 222    for (;I
.end() != true; I
++) 
 225       if (Dep
[I
].Upgrade() == true || Dep
[I
].Upgradable() == false || 
 226           I
->CurrentVer 
== 0 || Dep
[I
].Delete() == true) 
 229       List 
+= string(I
.Name()) + " "; 
 231    ShowList(out
,"The following packages have been kept back",List
); 
 234 // ShowUpgraded - Show upgraded packages                                /*{{{*/ 
 235 // --------------------------------------------------------------------- 
 237 void ShowUpgraded(ostream 
&out
,pkgDepCache 
&Dep
) 
 239    pkgCache::PkgIterator I 
= Dep
.PkgBegin(); 
 241    for (;I
.end() != true; I
++) 
 244       if (Dep
[I
].Upgrade() == false || Dep
[I
].NewInstall() == true) 
 247       List 
+= string(I
.Name()) + " "; 
 249    ShowList(out
,"The following packages will be upgraded",List
); 
 252 // ShowHold - Show held but changed packages                            /*{{{*/ 
 253 // --------------------------------------------------------------------- 
 255 bool ShowHold(ostream 
&out
,pkgDepCache 
&Dep
) 
 257    pkgCache::PkgIterator I 
= Dep
.PkgBegin(); 
 259    for (;I
.end() != true; I
++) 
 261       if (Dep
[I
].InstallVer 
!= (pkgCache::Version 
*)I
.CurrentVer() && 
 262           I
->SelectedState 
== pkgCache::State::Hold
) 
 263          List 
+= string(I
.Name()) + " "; 
 266    return ShowList(out
,"The following held packages will be changed:",List
); 
 269 // ShowEssential - Show an essential package warning                    /*{{{*/ 
 270 // --------------------------------------------------------------------- 
 271 /* This prints out a warning message that is not to be ignored. It shows 
 272    all essential packages and their dependents that are to be removed.  
 273    It is insanely risky to remove the dependents of an essential package! */ 
 274 bool ShowEssential(ostream 
&out
,pkgDepCache 
&Dep
) 
 276    pkgCache::PkgIterator I 
= Dep
.PkgBegin(); 
 278    bool *Added 
= new bool[Dep
.HeaderP
->PackageCount
]; 
 279    for (unsigned int I 
= 0; I 
!= Dep
.HeaderP
->PackageCount
; I
++) 
 282    for (;I
.end() != true; I
++) 
 284       if ((I
->Flags 
& pkgCache::Flag::Essential
) != pkgCache::Flag::Essential
) 
 287       // The essential package is being removed 
 288       if (Dep
[I
].Delete() == true) 
 290          if (Added
[I
->ID
] == false) 
 293             List 
+= string(I
.Name()) + " "; 
 297       if (I
->CurrentVer 
== 0) 
 300       // Print out any essential package depenendents that are to be removed 
 301       for (pkgDepCache::DepIterator D 
= I
.CurrentVer().DependsList(); D
.end() == false; D
++) 
 303          // Skip everything but depends 
 304          if (D
->Type 
!= pkgCache::Dep::PreDepends 
&& 
 305              D
->Type 
!= pkgCache::Dep::Depends
) 
 308          pkgCache::PkgIterator P 
= D
.SmartTargetPkg(); 
 309          if (Dep
[P
].Delete() == true) 
 311             if (Added
[P
->ID
] == true) 
 316             sprintf(S
,"%s (due to %s) ",P
.Name(),I
.Name()); 
 323    if (List
.empty() == false) 
 324       out 
<< "WARNING: The following essential packages will be removed" << endl
; 
 325    return ShowList(out
,"This should NOT be done unless you know exactly what you are doing!",List
); 
 328 // Stats - Show some statistics                                         /*{{{*/ 
 329 // --------------------------------------------------------------------- 
 331 void Stats(ostream 
&out
,pkgDepCache 
&Dep
) 
 333    unsigned long Upgrade 
= 0; 
 334    unsigned long Install 
= 0; 
 335    for (pkgCache::PkgIterator I 
= Dep
.PkgBegin(); I
.end() == false; I
++) 
 337       if (Dep
[I
].NewInstall() == true) 
 340          if (Dep
[I
].Upgrade() == true) 
 344    out 
<< Upgrade 
<< " packages upgraded, " <<  
 345       Install 
<< " newly installed, " << 
 346       Dep
.DelCount() << " to remove and " <<  
 347       Dep
.KeepCount() << " not upgraded." << endl
; 
 349    if (Dep
.BadCount() != 0) 
 350       out 
<< Dep
.BadCount() << " packages not fully installed or removed." << endl
; 
 354 // class CacheFile - Cover class for some dependency cache functions    /*{{{*/ 
 355 // --------------------------------------------------------------------- 
 366    inline operator pkgDepCache 
&() {return *Cache
;}; 
 367    inline pkgDepCache 
*operator ->() {return Cache
;}; 
 368    inline pkgDepCache 
&operator *() {return *Cache
;}; 
 371    CacheFile() : File(0), Map(0), Cache(0) {}; 
 380 // CacheFile::Open - Open the cache file                                /*{{{*/ 
 381 // --------------------------------------------------------------------- 
 382 /* This routine generates the caches and then opens the dependency cache 
 383    and verifies that the system is OK. */ 
 384 bool CacheFile::Open() 
 386    if (_error
->PendingError() == true) 
 389    // Create a progress class 
 390    OpTextProgress 
Progress(*_config
); 
 392    // Read the source list 
 394    if (List
.ReadMainList() == false) 
 395       return _error
->Error("The list of sources could not be read."); 
 397    // Build all of the caches 
 398    pkgMakeStatusCache(List
,Progress
); 
 399    if (_error
->PendingError() == true) 
 400       return _error
->Error("The package lists or status file could not be parsed or opened."); 
 401    if (_error
->empty() == false) 
 402       _error
->Warning("You may want to run apt-get update to correct theses missing files"); 
 406    // Open the cache file 
 407    File 
= new FileFd(_config
->FindFile("Dir::Cache::pkgcache"),FileFd::ReadOnly
); 
 408    if (_error
->PendingError() == true) 
 411    Map 
= new MMap(*File
,MMap::Public 
| MMap::ReadOnly
); 
 412    if (_error
->PendingError() == true) 
 415    Cache 
= new pkgDepCache(*Map
,Progress
); 
 416    if (_error
->PendingError() == true) 
 421    // Check that the system is OK 
 422    if (Cache
->DelCount() != 0 || Cache
->InstCount() != 0) 
 423       return _error
->Error("Internal Error, non-zero counts"); 
 425    // Apply corrections for half-installed packages 
 426    if (pkgApplyStatus(*Cache
) == false) 
 430    if (Cache
->BrokenCount() == 0) 
 433    // Attempt to fix broken things 
 434    if (_config
->FindB("APT::Get::Fix-Broken",false) == true) 
 436       c1out 
<< "Correcting dependencies..." << flush
; 
 437       if (pkgFixBroken(*Cache
) == false || Cache
->BrokenCount() != 0) 
 439          c1out 
<< " failed." << endl
; 
 440          ShowBroken(c1out
,*this); 
 442          return _error
->Error("Unable to correct dependencies"); 
 444       if (pkgMinimizeUpgrade(*Cache
) == false) 
 445          return _error
->Error("Unable to minimize the upgrade set"); 
 447       c1out 
<< " Done" << endl
; 
 451       c1out 
<< "You might want to run `apt-get -f install' to correct these." << endl
; 
 452       ShowBroken(c1out
,*this); 
 454       return _error
->Error("Unmet dependencies. Try using -f."); 
 461 // InstallPackages - Actually download and install the packages         /*{{{*/ 
 462 // --------------------------------------------------------------------- 
 463 /* This displays the informative messages describing what is going to  
 464    happen and then calls the download routines */ 
 465 bool InstallPackages(CacheFile 
&Cache
,bool ShwKept
,bool Ask 
= true) 
 469    // Show all the various warning indicators 
 470    ShowDel(c1out
,Cache
); 
 471    ShowNew(c1out
,Cache
); 
 473       ShowKept(c1out
,Cache
); 
 474    Fail 
|= !ShowHold(c1out
,Cache
); 
 475    if (_config
->FindB("APT::Get::Show-Upgraded",false) == true) 
 476       ShowUpgraded(c1out
,Cache
); 
 477    Fail 
|= !ShowEssential(c1out
,Cache
); 
 481    if (Cache
->BrokenCount() != 0) 
 483       ShowBroken(c1out
,Cache
); 
 484       return _error
->Error("Internal Error, InstallPackages was called with broken packages!"); 
 487    if (Cache
->DelCount() == 0 && Cache
->InstCount() == 0 &&  
 488        Cache
->BadCount() == 0) 
 491    // Run the simulator .. 
 492    if (_config
->FindB("APT::Get::Simulate") == true) 
 494       pkgSimulate 
PM(Cache
); 
 495       return PM
.DoInstall(); 
 498    // Create the text record parser 
 499    pkgRecords 
Recs(Cache
); 
 500    if (_error
->PendingError() == true) 
 503    // Lock the archive directory 
 504    if (_config
->FindB("Debug::NoLocking",false) == false) 
 506       FileFd 
Lock(GetLock(_config
->FindDir("Dir::Cache::Archives") + "lock")); 
 507       if (_error
->PendingError() == true) 
 508          return _error
->Error("Unable to lock the download directory"); 
 511    // Create the download object 
 512    AcqTextStatus 
Stat(ScreenWidth
,_config
->FindI("quiet",0));    
 513    pkgAcquire 
Fetcher(&Stat
); 
 515    // Read the source list 
 517    if (List
.ReadMainList() == false) 
 518       return _error
->Error("The list of sources could not be read."); 
 520    // Create the package manager and prepare to download 
 522    if (PM
.GetArchives(&Fetcher
,&List
,&Recs
) == false) 
 525    // Display statistics 
 526    unsigned long FetchBytes 
= Fetcher
.FetchNeeded(); 
 527    unsigned long DebBytes 
= Fetcher
.TotalNeeded(); 
 528    if (DebBytes 
!= Cache
->DebSize()) 
 530       c0out 
<< DebBytes 
<< ',' << Cache
->DebSize() << endl
; 
 531       c0out 
<< "How odd.. The sizes didn't match, email apt@packages.debian.org" << endl
; 
 535    c2out 
<< "Need to get "; 
 536    if (DebBytes 
!= FetchBytes
) 
 537       c2out 
<< SizeToStr(FetchBytes
) << '/' << SizeToStr(DebBytes
); 
 539       c2out 
<< SizeToStr(DebBytes
); 
 541    c1out 
<< " of archives. After unpacking "; 
 544    if (Cache
->UsrSize() >= 0) 
 545       c2out 
<< SizeToStr(Cache
->UsrSize()) << " will be used." << endl
; 
 547       c2out 
<< SizeToStr(-1*Cache
->UsrSize()) << " will be freed." << endl
; 
 549    if (_error
->PendingError() == true) 
 553    if (_config
->FindB("APT::Get::Assume-Yes",false) == true) 
 555       if (Fail 
== true && _config
->FindB("APT::Get::Force-Yes",false) == false) 
 556          return _error
->Error("There are problems and -y was used without --force-yes"); 
 559    // Prompt to continue 
 562       if (_config
->FindI("quiet",0) < 2 || 
 563           _config
->FindB("APT::Get::Assume-Yes",false) == false) 
 564          c2out 
<< "Do you want to continue? [Y/n] " << flush
; 
 566       if (YnPrompt() == false) 
 571    if (Fetcher
.Run() == false) 
 576    bool Transient 
= false; 
 577    for (pkgAcquire::Item 
**I 
= Fetcher
.ItemsBegin(); I 
!= Fetcher
.ItemsEnd(); I
++) 
 579       if ((*I
)->Status 
== pkgAcquire::Item::StatDone 
&& 
 580           (*I
)->Complete 
== true) 
 583       if ((*I
)->Status 
== pkgAcquire::Item::StatIdle
) 
 590       cerr 
<< "Failed to fetch " << (*I
)->Describe() << endl
; 
 591       cerr 
<< "  " << (*I
)->ErrorText 
<< endl
; 
 595    if (_config
->FindB("APT::Get::Download-Only",false) == true) 
 598    if (Failed 
== true && _config
->FindB("APT::Get::Fix-Missing",false) == false) 
 600       if (Transient 
== true) 
 602          c2out 
<< "Upgrading with disk swapping is not supported in this version." << endl
; 
 603          c2out 
<< "Try running multiple times with --fix-missing" << endl
; 
 606       return _error
->Error("Unable to fetch some archives, maybe try with --fix-missing?"); 
 609    // Try to deal with missing package files 
 610    if (PM
.FixMissing() == false) 
 612       cerr 
<< "Unable to correct missing packages." << endl
; 
 613       return _error
->Error("Aborting Install."); 
 617    return PM
.DoInstall(); 
 621 // DoUpdate - Update the package lists                                  /*{{{*/ 
 622 // --------------------------------------------------------------------- 
 624 bool DoUpdate(CommandLine 
&) 
 626    // Get the source list 
 628    if (List
.ReadMainList() == false) 
 631    // Lock the list directory 
 632    if (_config
->FindB("Debug::NoLocking",false) == false) 
 634       FileFd 
Lock(GetLock(_config
->FindDir("Dir::State::Lists") + "lock")); 
 635       if (_error
->PendingError() == true) 
 636          return _error
->Error("Unable to lock the list directory"); 
 639    // Create the download object 
 640    AcqTextStatus 
Stat(ScreenWidth
,_config
->FindI("quiet",0)); 
 641    pkgAcquire 
Fetcher(&Stat
); 
 643    // Populate it with the source selection 
 644    pkgSourceList::const_iterator I
; 
 645    for (I 
= List
.begin(); I 
!= List
.end(); I
++) 
 647       new pkgAcqIndex(&Fetcher
,I
); 
 648       if (_error
->PendingError() == true) 
 653    if (Fetcher
.Run() == false) 
 656    // Clean out any old list files 
 657    if (Fetcher
.Clean(_config
->FindDir("Dir::State::lists")) == false || 
 658        Fetcher
.Clean(_config
->FindDir("Dir::State::lists") + "partial/") == false) 
 661    // Prepare the cache.    
 663    if (Cache
.Open() == false) 
 669 // DoUpgrade - Upgrade all packages                                     /*{{{*/ 
 670 // --------------------------------------------------------------------- 
 671 /* Upgrade all packages without installing new packages or erasing old 
 673 bool DoUpgrade(CommandLine 
&CmdL
) 
 676    if (Cache
.Open() == false) 
 680    if (pkgAllUpgrade(Cache
) == false) 
 682       ShowBroken(c1out
,Cache
); 
 683       return _error
->Error("Internal Error, AllUpgrade broke stuff"); 
 686    return InstallPackages(Cache
,true); 
 689 // DoInstall - Install packages from the command line                   /*{{{*/ 
 690 // --------------------------------------------------------------------- 
 691 /* Install named packages */ 
 692 bool DoInstall(CommandLine 
&CmdL
) 
 695    if (Cache
.Open() == false) 
 698    unsigned int ExpectedInst 
= 0; 
 699    unsigned int Packages 
= 0; 
 700    pkgProblemResolver 
Fix(Cache
); 
 702    bool DefRemove 
= false; 
 703    if (strcasecmp(CmdL
.FileList
[0],"remove") == 0) 
 706    for (const char **I 
= CmdL
.FileList 
+ 1; *I 
!= 0; I
++) 
 708       // Duplicate the string 
 709       unsigned int Length 
= strlen(*I
); 
 711       if (Length 
>= sizeof(S
)) 
 715       // See if we are removing the package 
 716       bool Remove 
= DefRemove
; 
 717       if (Cache
->FindPkg(S
).end() == true) 
 719          // Handle an optional end tag indicating what to do 
 720          if (S
[Length 
- 1] == '-') 
 725          if (S
[Length 
- 1] == '+') 
 732       // Locate the package 
 733       pkgCache::PkgIterator Pkg 
= Cache
->FindPkg(S
); 
 735       if (Pkg
.end() == true) 
 736          return _error
->Error("Couldn't find package %s",S
); 
 738       // Handle the no-upgrade case 
 739       if (_config
->FindB("APT::Get::no-upgrade",false) == true && 
 740           Pkg
->CurrentVer 
!= 0) 
 742          c1out 
<< "Skipping " << Pkg
.Name() << ", it is already installed and no-upgrade is set." << endl
; 
 746       // Check if there is something new to install 
 747       pkgDepCache::StateCache 
&State 
= (*Cache
)[Pkg
]; 
 748       if (State
.CandidateVer 
== 0) 
 750          if (Pkg
->ProvidesList 
!= 0) 
 752             c1out 
<< "Package " << S 
<< " is a virtual package provided by:" << endl
; 
 754             pkgCache::PrvIterator I 
= Pkg
.ProvidesList(); 
 755             for (; I
.end() == false; I
++) 
 757                pkgCache::PkgIterator Pkg 
= I
.OwnerPkg(); 
 759                if ((*Cache
)[Pkg
].CandidateVerIter(*Cache
) == I
.OwnerVer()) 
 760                   c1out 
<< "  " << Pkg
.Name() << " " << I
.OwnerVer().VerStr() << endl
; 
 762                if ((*Cache
)[Pkg
].InstVerIter(*Cache
) == I
.OwnerVer()) 
 763                   c1out 
<< "  " << Pkg
.Name() << " " << I
.OwnerVer().VerStr() << 
 764                     " [Installed]"<< endl
; 
 766             c1out 
<< "You should explicly select one to install." << endl
; 
 770             c1out 
<< "Package " << S 
<< " has no available version, but exists in the database." << endl
; 
 771             c1out 
<< "This typically means that the package was mentioned in a dependency and " << endl
; 
 772             c1out 
<< "never uploaded, or that it is an obsolete package." << endl
; 
 775             pkgCache::DepIterator Dep 
= Pkg
.RevDependsList(); 
 776             for (; Dep
.end() == false; Dep
++) 
 778                if (Dep
->Type 
!= pkgCache::Dep::Replaces
) 
 780                List 
+= string(Dep
.ParentPkg().Name()) + " "; 
 782             ShowList(c1out
,"However the following packages replace it:",List
); 
 785          return _error
->Error("Package %s has no installation candidate",S
); 
 792          Cache
->MarkDelete(Pkg
); 
 797       Cache
->MarkInstall(Pkg
,false); 
 798       if (State
.Install() == false) 
 799          c1out 
<< "Sorry, " << S 
<< " is already the newest version"  << endl
; 
 803       // Install it with autoinstalling enabled. 
 804       if (State
.InstBroken() == true) 
 805          Cache
->MarkInstall(Pkg
,true); 
 808    // Call the scored problem resolver 
 809    Fix
.InstallProtect(); 
 810    if (Fix
.Resolve(true) == false) 
 813    // Now we check the state of the packages, 
 814    if (Cache
->BrokenCount() != 0) 
 816       c1out 
<< "Some packages could not be installed. This may mean that you have" << endl
; 
 817       c1out 
<< "requested an impossible situation or if you are using the unstable" << endl
; 
 818       c1out 
<< "distribution that some required packages have not yet been created" << endl
; 
 819       c1out 
<< "or been moved out of Incoming." << endl
; 
 823          c1out 
<< "Since you only requested a single operation it is extremely likely that" << endl
; 
 824          c1out 
<< "the package is simply not installable and a bug report against" << endl
; 
 825          c1out 
<< "that package should be filed." << endl
; 
 828       c1out 
<< "The following information may help to resolve the situation:" << endl
; 
 830       ShowBroken(c1out
,Cache
); 
 831       return _error
->Error("Sorry, broken packages"); 
 834    /* Print out a list of packages that are going to be installed extra 
 835       to what the user asked */ 
 836    if (Cache
->InstCount() != ExpectedInst
) 
 839       pkgCache::PkgIterator I 
= Cache
->PkgBegin(); 
 840       for (;I
.end() != true; I
++) 
 842          if ((*Cache
)[I
].Install() == false) 
 846          for (J 
= CmdL
.FileList 
+ 1; *J 
!= 0; J
++) 
 847             if (strcmp(*J
,I
.Name()) == 0) 
 851             List 
+= string(I
.Name()) + " "; 
 854       ShowList(c1out
,"The following extra packages will be installed:",List
); 
 857    // See if we need to prompt 
 858    if (Cache
->InstCount() == ExpectedInst 
&& Cache
->DelCount() == 0) 
 859       return InstallPackages(Cache
,false,false); 
 861    return InstallPackages(Cache
,false);    
 864 // DoDistUpgrade - Automatic smart upgrader                             /*{{{*/ 
 865 // --------------------------------------------------------------------- 
 866 /* Intelligent upgrader that will install and remove packages at will */ 
 867 bool DoDistUpgrade(CommandLine 
&CmdL
) 
 870    if (Cache
.Open() == false) 
 873    c0out 
<< "Calculating Upgrade... " << flush
; 
 874    if (pkgDistUpgrade(*Cache
) == false) 
 876       c0out 
<< "Failed" << endl
; 
 877       ShowBroken(c1out
,Cache
); 
 881    c0out 
<< "Done" << endl
; 
 883    return InstallPackages(Cache
,true); 
 886 // DoDSelectUpgrade - Do an upgrade by following dselects selections    /*{{{*/ 
 887 // --------------------------------------------------------------------- 
 888 /* Follows dselect's selections */ 
 889 bool DoDSelectUpgrade(CommandLine 
&CmdL
) 
 892    if (Cache
.Open() == false) 
 895    // Install everything with the install flag set 
 896    pkgCache::PkgIterator I 
= Cache
->PkgBegin(); 
 897    for (;I
.end() != true; I
++) 
 899       /* Install the package only if it is a new install, the autoupgrader 
 900          will deal with the rest */ 
 901       if (I
->SelectedState 
== pkgCache::State::Install
) 
 902          Cache
->MarkInstall(I
,false); 
 905    /* Now install their deps too, if we do this above then order of 
 906       the status file is significant for | groups */ 
 907    for (I 
= Cache
->PkgBegin();I
.end() != true; I
++) 
 909       /* Install the package only if it is a new install, the autoupgrader 
 910          will deal with the rest */ 
 911       if (I
->SelectedState 
== pkgCache::State::Install
) 
 912          Cache
->MarkInstall(I
); 
 915    // Apply erasures now, they override everything else. 
 916    for (I 
= Cache
->PkgBegin();I
.end() != true; I
++) 
 919       if (I
->SelectedState 
== pkgCache::State::DeInstall 
|| 
 920           I
->SelectedState 
== pkgCache::State::Purge
) 
 921          Cache
->MarkDelete(I
); 
 924    /* Use updates smart upgrade to do the rest, it will automatically 
 926    if (pkgAllUpgrade(Cache
) == false) 
 928       ShowBroken(c1out
,Cache
); 
 929       return _error
->Error("Internal Error, AllUpgrade broke stuff"); 
 932    return InstallPackages(Cache
,false); 
 935 // DoClean - Remove download archives                                   /*{{{*/ 
 936 // --------------------------------------------------------------------- 
 938 bool DoClean(CommandLine 
&CmdL
) 
 941    Fetcher
.Clean(_config
->FindDir("Dir::Cache::archives")); 
 942    Fetcher
.Clean(_config
->FindDir("Dir::Cache::archives") + "partial/"); 
 946 // DoCheck - Perform the check operation                                /*{{{*/ 
 947 // --------------------------------------------------------------------- 
 948 /* Opening automatically checks the system, this command is mostly used 
 950 bool DoCheck(CommandLine 
&CmdL
) 
 959 // ShowHelp - Show a help screen                                        /*{{{*/ 
 960 // --------------------------------------------------------------------- 
 962 bool ShowHelp(CommandLine 
&CmdL
) 
 964    cout 
<< PACKAGE 
<< ' ' << VERSION 
<< " for " << ARCHITECTURE 
<< 
 965        " compiled on " << __DATE__ 
<< "  " << __TIME__ 
<< endl
; 
 967    cout 
<< "Usage: apt-get [options] command" << endl
; 
 968    cout 
<< "       apt-get [options] install pkg1 [pkg2 ...]" << endl
; 
 970    cout 
<< "apt-get is a simple command line interface for downloading and" << endl
; 
 971    cout 
<< "installing packages. The most frequently used commands are update" << endl
; 
 972    cout 
<< "and install." << endl
;    
 974    cout 
<< "Commands:" << endl
; 
 975    cout 
<< "   update - Retrieve new lists of packages" << endl
; 
 976    cout 
<< "   upgrade - Perform an upgrade" << endl
; 
 977    cout 
<< "   install - Install new packages (pkg is libc6 not libc6.deb)" << endl
; 
 978    cout 
<< "   remove - Remove packages" << endl
; 
 979    cout 
<< "   dist-upgrade - Distribution upgrade, see apt-get(8)" << endl
; 
 980    cout 
<< "   dselect-upgrade - Follow dselect selections" << endl
; 
 981    cout 
<< "   clean - Erase downloaded archive files" << endl
; 
 982    cout 
<< "   check - Verify that there are no broken dependencies" << endl
; 
 984    cout 
<< "Options:" << endl
; 
 985    cout 
<< "  -h  This help text." << endl
; 
 986    cout 
<< "  -q  Loggable output - no progress indicator" << endl
; 
 987    cout 
<< "  -qq No output except for errors" << endl
; 
 988    cout 
<< "  -d  Download only - do NOT install or unpack archives" << endl
; 
 989    cout 
<< "  -s  No-act. Perform ordering simulation" << endl
; 
 990    cout 
<< "  -y  Assume Yes to all queries and do not prompt" << endl
; 
 991    cout 
<< "  -f  Attempt to continue if the integrity check fails" << endl
; 
 992    cout 
<< "  -m  Attempt to continue if archives are unlocatable" << endl
; 
 993    cout 
<< "  -u  Show a list of upgraded packages as well" << endl
; 
 994    cout 
<< "  -c=? Read this configuration file" << endl
; 
 995    cout 
<< "  -o=? Set an arbitary configuration option, ie -o dir::cache=/tmp" << endl
; 
 996    cout 
<< "See the apt-get(8), sources.list(5) and apt.conf(5) manual" << endl
; 
 997    cout 
<< "pages for more information." << endl
; 
1001 // GetInitialize - Initialize things for apt-get                        /*{{{*/ 
1002 // --------------------------------------------------------------------- 
1004 void GetInitialize() 
1006    _config
->Set("quiet",0); 
1007    _config
->Set("help",false); 
1008    _config
->Set("APT::Get::Download-Only",false); 
1009    _config
->Set("APT::Get::Simulate",false); 
1010    _config
->Set("APT::Get::Assume-Yes",false); 
1011    _config
->Set("APT::Get::Fix-Broken",false); 
1012    _config
->Set("APT::Get::Force-Yes",false); 
1015 // SigWinch - Window size change signal handler                         /*{{{*/ 
1016 // --------------------------------------------------------------------- 
1020    // Riped from GNU ls 
1024    if (ioctl(1, TIOCGWINSZ
, &ws
) != -1 && ws
.ws_col 
>= 5) 
1025       ScreenWidth 
= ws
.ws_col 
- 1; 
1030 int main(int argc
,const char *argv
[]) 
1032    CommandLine::Args Args
[] = { 
1033       {'h',"help","help",0}, 
1034       {'q',"quiet","quiet",CommandLine::IntLevel
}, 
1035       {'q',"silent","quiet",CommandLine::IntLevel
}, 
1036       {'d',"download-only","APT::Get::Download-Only",0}, 
1037       {'s',"simulate","APT::Get::Simulate",0},       
1038       {'s',"just-print","APT::Get::Simulate",0},       
1039       {'s',"recon","APT::Get::Simulate",0},       
1040       {'s',"no-act","APT::Get::Simulate",0},       
1041       {'y',"yes","APT::Get::Assume-Yes",0},       
1042       {'y',"assume-yes","APT::Get::Assume-Yes",0},       
1043       {'f',"fix-broken","APT::Get::Fix-Broken",0}, 
1044       {'u',"show-upgraded","APT::Get::Show-Upgraded",0}, 
1045       {'m',"ignore-missing","APT::Get::Fix-Missing",0}, 
1046       {0,"fix-missing","APT::Get::Fix-Missing",0}, 
1047       {0,"ignore-hold","APT::Ingore-Hold",0},       
1048       {0,"no-upgrade","APT::Get::no-upgrade",0}, 
1049       {0,"force-yes","APT::Get::force-yes",0}, 
1050       {'c',"config-file",0,CommandLine::ConfigFile
}, 
1051       {'o',"option",0,CommandLine::ArbItem
}, 
1053    CommandLine::Dispatch Cmds
[] = {{"update",&DoUpdate
}, 
1054                                    {"upgrade",&DoUpgrade
}, 
1055                                    {"install",&DoInstall
}, 
1056                                    {"remove",&DoInstall
}, 
1057                                    {"dist-upgrade",&DoDistUpgrade
}, 
1058                                    {"dselect-upgrade",&DoDSelectUpgrade
}, 
1064    // Parse the command line and initialize the package library 
1065    CommandLine 
CmdL(Args
,_config
); 
1066    if (pkgInitialize(*_config
) == false || 
1067        CmdL
.Parse(argc
,argv
) == false) 
1069       _error
->DumpErrors(); 
1073    // See if the help should be shown 
1074    if (_config
->FindB("help") == true || 
1075        CmdL
.FileSize() == 0) 
1076       return ShowHelp(CmdL
); 
1078    // Setup the output streams 
1079    c0out
.rdbuf(cout
.rdbuf()); 
1080    c1out
.rdbuf(cout
.rdbuf()); 
1081    c2out
.rdbuf(cout
.rdbuf()); 
1082    if (_config
->FindI("quiet",0) > 0) 
1083       c0out
.rdbuf(devnull
.rdbuf()); 
1084    if (_config
->FindI("quiet",0) > 1) 
1085       c1out
.rdbuf(devnull
.rdbuf()); 
1087    // Setup the signals 
1088    signal(SIGPIPE
,SIG_IGN
); 
1089    signal(SIGWINCH
,SigWinch
); 
1092    // Match the operation 
1093    CmdL
.DispatchArg(Cmds
); 
1095    // Print any errors or warnings found during parsing 
1096    if (_error
->empty() == false) 
1098       bool Errors 
= _error
->PendingError(); 
1099       _error
->DumpErrors(); 
1100       return Errors 
== true?100:0;