]>
git.saurik.com Git - apt.git/blob - apt-pkg/depcache.cc
   1 // -*- mode: cpp; mode: fold -*- 
   3 // $Id: depcache.cc,v 1.25 2001/05/27 05:36:04 jgg Exp $ 
   4 /* ###################################################################### 
   6    Dependency Cache - Caches Dependency information. 
   8    ##################################################################### */ 
  10 // Include Files                                                        /*{{{*/ 
  12 #pragma implementation "apt-pkg/depcache.h" 
  14 #include <apt-pkg/depcache.h> 
  15 #include <apt-pkg/version.h> 
  16 #include <apt-pkg/error.h> 
  17 #include <apt-pkg/sptr.h> 
  18 #include <apt-pkg/algorithms.h> 
  19 #include <apt-pkg/configuration.h> 
  23 // DepCache::pkgDepCache - Constructors                                 /*{{{*/ 
  24 // --------------------------------------------------------------------- 
  26 pkgDepCache::pkgDepCache(pkgCache 
*pCache
,Policy 
*Plcy
) : 
  27                 Cache(pCache
), PkgState(0), DepState(0) 
  32       delLocalPolicy 
= LocalPolicy 
= new Policy
; 
  35 // DepCache::~pkgDepCache - Destructor                                  /*{{{*/ 
  36 // --------------------------------------------------------------------- 
  38 pkgDepCache::~pkgDepCache() 
  42    delete delLocalPolicy
; 
  45 // DepCache::Init - Generate the initial extra structures.              /*{{{*/ 
  46 // --------------------------------------------------------------------- 
  47 /* This allocats the extension buffers and initializes them. */ 
  48 bool pkgDepCache::Init(OpProgress 
*Prog
) 
  52    PkgState 
= new StateCache
[Head().PackageCount
]; 
  53    DepState 
= new unsigned char[Head().DependsCount
]; 
  54    memset(PkgState
,0,sizeof(*PkgState
)*Head().PackageCount
); 
  55    memset(DepState
,0,sizeof(*DepState
)*Head().DependsCount
);  
  59       Prog
->OverallProgress(0,2*Head().PackageCount
,Head().PackageCount
, 
  60                             _("Building dependency tree")); 
  61       Prog
->SubProgress(Head().PackageCount
,_("Candidate versions")); 
  64    /* Set the current state of everything. In this state all of the 
  65       packages are kept exactly as is. See AllUpgrade */ 
  67    for (PkgIterator I 
= PkgBegin(); I
.end() != true; I
++,Done
++) 
  72       // Find the proper cache slot 
  73       StateCache 
&State 
= PkgState
[I
->ID
]; 
  76       // Figure out the install version 
  77       State
.CandidateVer 
= GetCandidateVer(I
); 
  78       State
.InstallVer 
= I
.CurrentVer(); 
  79       State
.Mode 
= ModeKeep
; 
  81       State
.Update(I
,*this); 
  87       Prog
->OverallProgress(Head().PackageCount
,2*Head().PackageCount
, 
  89                             _("Building dependency tree")); 
  90       Prog
->SubProgress(Head().PackageCount
,_("Dependency generation")); 
 102 // DepCache::CheckDep - Checks a single dependency                      /*{{{*/ 
 103 // --------------------------------------------------------------------- 
 104 /* This first checks the dependency against the main target package and 
 105    then walks along the package provides list and checks if each provides  
 106    will be installed then checks the provides against the dep. Res will be  
 107    set to the package which was used to satisfy the dep. */ 
 108 bool pkgDepCache::CheckDep(DepIterator Dep
,int Type
,PkgIterator 
&Res
) 
 110    Res 
= Dep
.TargetPkg(); 
 112    /* Check simple depends. A depends -should- never self match but  
 113       we allow it anyhow because dpkg does. Technically it is a packaging 
 114       bug. Conflicts may never self match */ 
 115    if (Dep
.TargetPkg() != Dep
.ParentPkg() ||  
 116        (Dep
->Type 
!= Dep::Conflicts 
&& Dep
->Type 
!= Dep::Obsoletes
)) 
 118       PkgIterator Pkg 
= Dep
.TargetPkg(); 
 119       // Check the base package 
 120       if (Type 
== NowVersion 
&& Pkg
->CurrentVer 
!= 0) 
 121          if (VS().CheckDep(Pkg
.CurrentVer().VerStr(),Dep
->CompareOp
, 
 122                                  Dep
.TargetVer()) == true) 
 125       if (Type 
== InstallVersion 
&& PkgState
[Pkg
->ID
].InstallVer 
!= 0) 
 126          if (VS().CheckDep(PkgState
[Pkg
->ID
].InstVerIter(*this).VerStr(), 
 127                                  Dep
->CompareOp
,Dep
.TargetVer()) == true) 
 130       if (Type 
== CandidateVersion 
&& PkgState
[Pkg
->ID
].CandidateVer 
!= 0) 
 131          if (VS().CheckDep(PkgState
[Pkg
->ID
].CandidateVerIter(*this).VerStr(), 
 132                                  Dep
->CompareOp
,Dep
.TargetVer()) == true) 
 136    if (Dep
->Type 
== Dep::Obsoletes
) 
 139    // Check the providing packages 
 140    PrvIterator P 
= Dep
.TargetPkg().ProvidesList(); 
 141    PkgIterator Pkg 
= Dep
.ParentPkg(); 
 142    for (; P
.end() != true; P
++) 
 144       /* Provides may never be applied against the same package if it is 
 145          a conflicts. See the comment above. */ 
 146       if (P
.OwnerPkg() == Pkg 
&& Dep
->Type 
== Dep::Conflicts
) 
 149       // Check if the provides is a hit 
 150       if (Type 
== NowVersion
) 
 152          if (P
.OwnerPkg().CurrentVer() != P
.OwnerVer()) 
 156       if (Type 
== InstallVersion
) 
 158          StateCache 
&State 
= PkgState
[P
.OwnerPkg()->ID
]; 
 159          if (State
.InstallVer 
!= (Version 
*)P
.OwnerVer()) 
 163       if (Type 
== CandidateVersion
) 
 165          StateCache 
&State 
= PkgState
[P
.OwnerPkg()->ID
]; 
 166          if (State
.CandidateVer 
!= (Version 
*)P
.OwnerVer()) 
 170       // Compare the versions. 
 171       if (VS().CheckDep(P
.ProvideVersion(),Dep
->CompareOp
,Dep
.TargetVer()) == true) 
 181 // DepCache::AddSizes - Add the packages sizes to the counters          /*{{{*/ 
 182 // --------------------------------------------------------------------- 
 183 /* Call with Mult = -1 to preform the inverse opration */ 
 184 void pkgDepCache::AddSizes(const PkgIterator 
&Pkg
,signed long Mult
) 
 186    StateCache 
&P 
= PkgState
[Pkg
->ID
]; 
 188    if (Pkg
->VersionList 
== 0) 
 191    if (Pkg
.State() == pkgCache::PkgIterator::NeedsConfigure 
&&  
 195    // Compute the size data 
 196    if (P
.NewInstall() == true) 
 198       iUsrSize 
+= (signed)(Mult
*P
.InstVerIter(*this)->InstalledSize
); 
 199       iDownloadSize 
+= (signed)(Mult
*P
.InstVerIter(*this)->Size
); 
 204    if (Pkg
->CurrentVer 
!= 0 &&  
 205        (P
.InstallVer 
!= (Version 
*)Pkg
.CurrentVer() ||  
 206         (P
.iFlags 
& ReInstall
) == ReInstall
) && P
.InstallVer 
!= 0) 
 208       iUsrSize 
+= (signed)(Mult
*((signed)P
.InstVerIter(*this)->InstalledSize 
-  
 209                         (signed)Pkg
.CurrentVer()->InstalledSize
)); 
 210       iDownloadSize 
+= (signed)(Mult
*P
.InstVerIter(*this)->Size
); 
 215    if (Pkg
.State() == pkgCache::PkgIterator::NeedsUnpack 
&& 
 218       iDownloadSize 
+= (signed)(Mult
*P
.InstVerIter(*this)->Size
); 
 223    if (Pkg
->CurrentVer 
!= 0 && P
.InstallVer 
== 0) 
 225       iUsrSize 
-= (signed)(Mult
*Pkg
.CurrentVer()->InstalledSize
); 
 230 // DepCache::AddStates - Add the package to the state counter           /*{{{*/ 
 231 // --------------------------------------------------------------------- 
 232 /* This routine is tricky to use, you must make sure that it is never  
 233    called twice for the same package. This means the Remove/Add section 
 234    should be as short as possible and not encompass any code that will  
 235    calld Remove/Add itself. Remember, dependencies can be circular so 
 236    while processing a dep for Pkg it is possible that Add/Remove 
 237    will be called on Pkg */ 
 238 void pkgDepCache::AddStates(const PkgIterator 
&Pkg
,int Add
) 
 240    StateCache 
&State 
= PkgState
[Pkg
->ID
]; 
 242    // The Package is broken (either minimal dep or policy dep) 
 243    if ((State
.DepState 
& DepInstMin
) != DepInstMin
) 
 245    if ((State
.DepState 
& DepInstPolicy
) != DepInstPolicy
) 
 246       iPolicyBrokenCount 
+= Add
; 
 249    if (Pkg
.State() != PkgIterator::NeedsNothing
) 
 253    if (Pkg
->CurrentVer 
== 0) 
 255       if (State
.Mode 
== ModeDelete 
&&  
 256           (State
.iFlags 
| Purge
) == Purge 
&& Pkg
.Purge() == false) 
 259       if (State
.Mode 
== ModeInstall
) 
 264    // Installed, no upgrade 
 265    if (State
.Status 
== 0) 
 267       if (State
.Mode 
== ModeDelete
) 
 270          if ((State
.iFlags 
& ReInstall
) == ReInstall
) 
 276    // Alll 3 are possible 
 277    if (State
.Mode 
== ModeDelete
) 
 279    if (State
.Mode 
== ModeKeep
) 
 281    if (State
.Mode 
== ModeInstall
) 
 285 // DepCache::BuildGroupOrs - Generate the Or group dep data             /*{{{*/ 
 286 // --------------------------------------------------------------------- 
 287 /* The or group results are stored in the last item of the or group. This 
 288    allows easy detection of the state of a whole or'd group. */ 
 289 void pkgDepCache::BuildGroupOrs(VerIterator 
const &V
) 
 291    unsigned char Group 
= 0; 
 293    for (DepIterator D 
= V
.DependsList(); D
.end() != true; D
++) 
 295       // Build the dependency state. 
 296       unsigned char &State 
= DepState
[D
->ID
]; 
 298       /* Invert for Conflicts. We have to do this twice to get the 
 299          right sense for a conflicts group */ 
 300       if (D
->Type 
== Dep::Conflicts 
|| D
->Type 
== Dep::Obsoletes
) 
 303       // Add to the group if we are within an or.. 
 307       if ((D
->CompareOp 
& Dep::Or
) != Dep::Or
) 
 310       // Invert for Conflicts 
 311       if (D
->Type 
== Dep::Conflicts 
|| D
->Type 
== Dep::Obsoletes
) 
 316 // DepCache::VersionState - Perform a pass over a dependency list       /*{{{*/ 
 317 // --------------------------------------------------------------------- 
 318 /* This is used to run over a dependency list and determine the dep 
 319    state of the list, filtering it through both a Min check and a Policy 
 320    check. The return result will have SetMin/SetPolicy low if a check 
 321    fails. It uses the DepState cache for it's computations. */ 
 322 unsigned char pkgDepCache::VersionState(DepIterator D
,unsigned char Check
, 
 323                                        unsigned char SetMin
, 
 324                                        unsigned char SetPolicy
) 
 326    unsigned char Dep 
= 0xFF; 
 328    while (D
.end() != true) 
 330       // Compute a single dependency element (glob or) 
 331       DepIterator Start 
= D
; 
 332       unsigned char State 
= 0; 
 333       for (bool LastOR 
= true; D
.end() == false && LastOR 
== true; D
++) 
 335          State 
|= DepState
[D
->ID
]; 
 336          LastOR 
= (D
->CompareOp 
& Dep::Or
) == Dep::Or
; 
 339       // Minimum deps that must be satisfied to have a working package 
 340       if (Start
.IsCritical() == true) 
 341          if ((State 
& Check
) != Check
) 
 344       // Policy deps that must be satisfied to install the package 
 345       if (IsImportantDep(Start
) == true &&  
 346           (State 
& Check
) != Check
) 
 353 // DepCache::DependencyState - Compute the 3 results for a dep          /*{{{*/ 
 354 // --------------------------------------------------------------------- 
 355 /* This is the main dependency computation bit. It computes the 3 main 
 356    results for a dependencys, Now, Install and Candidate. Callers must 
 357    invert the result if dealing with conflicts. */ 
 358 unsigned char pkgDepCache::DependencyState(DepIterator 
&D
) 
 360    unsigned char State 
= 0; 
 362    if (CheckDep(D
,NowVersion
) == true) 
 364    if (CheckDep(D
,InstallVersion
) == true) 
 366    if (CheckDep(D
,CandidateVersion
) == true) 
 372 // DepCache::UpdateVerState - Compute the Dep member of the state       /*{{{*/ 
 373 // --------------------------------------------------------------------- 
 374 /* This determines the combined dependency representation of a package 
 375    for its two states now and install. This is done by using the pre-generated 
 376    dependency information. */ 
 377 void pkgDepCache::UpdateVerState(PkgIterator Pkg
) 
 379    // Empty deps are always true 
 380    StateCache 
&State 
= PkgState
[Pkg
->ID
]; 
 381    State
.DepState 
= 0xFF; 
 383    // Check the Current state 
 384    if (Pkg
->CurrentVer 
!= 0) 
 386       DepIterator D 
= Pkg
.CurrentVer().DependsList(); 
 387       State
.DepState 
&= VersionState(D
,DepNow
,DepNowMin
,DepNowPolicy
); 
 390    /* Check the candidate state. We do not compare against the whole as 
 391       a candidate state but check the candidate version against the  
 393    if (State
.CandidateVer 
!= 0) 
 395       DepIterator D 
= State
.CandidateVerIter(*this).DependsList(); 
 396       State
.DepState 
&= VersionState(D
,DepInstall
,DepCandMin
,DepCandPolicy
); 
 399    // Check target state which can only be current or installed 
 400    if (State
.InstallVer 
!= 0) 
 402       DepIterator D 
= State
.InstVerIter(*this).DependsList(); 
 403       State
.DepState 
&= VersionState(D
,DepInstall
,DepInstMin
,DepInstPolicy
); 
 407 // DepCache::Update - Figure out all the state information              /*{{{*/ 
 408 // --------------------------------------------------------------------- 
 409 /* This will figure out the state of all the packages and all the  
 410    dependencies based on the current policy. */ 
 411 void pkgDepCache::Update(OpProgress 
*Prog
) 
 421    // Perform the depends pass 
 423    for (PkgIterator I 
= PkgBegin(); I
.end() != true; I
++,Done
++) 
 425       if (Prog 
!= 0 && Done%20 
== 0) 
 426          Prog
->Progress(Done
); 
 427       for (VerIterator V 
= I
.VersionList(); V
.end() != true; V
++) 
 429          unsigned char Group 
= 0; 
 431          for (DepIterator D 
= V
.DependsList(); D
.end() != true; D
++) 
 433             // Build the dependency state. 
 434             unsigned char &State 
= DepState
[D
->ID
]; 
 435             State 
= DependencyState(D
); 
 437             // Add to the group if we are within an or.. 
 440             if ((D
->CompareOp 
& Dep::Or
) != Dep::Or
) 
 443             // Invert for Conflicts 
 444             if (D
->Type 
== Dep::Conflicts 
|| D
->Type 
== Dep::Obsoletes
) 
 449       // Compute the pacakge dependency state and size additions 
 456       Prog
->Progress(Done
); 
 459 // DepCache::Update - Update the deps list of a package                 /*{{{*/ 
 460 // --------------------------------------------------------------------- 
 461 /* This is a helper for update that only does the dep portion of the scan.  
 462    It is mainly ment to scan reverse dependencies. */ 
 463 void pkgDepCache::Update(DepIterator D
) 
 465    // Update the reverse deps 
 466    for (;D
.end() != true; D
++) 
 468       unsigned char &State 
= DepState
[D
->ID
]; 
 469       State 
= DependencyState(D
); 
 471       // Invert for Conflicts 
 472       if (D
->Type 
== Dep::Conflicts 
|| D
->Type 
== Dep::Obsoletes
) 
 475       RemoveStates(D
.ParentPkg()); 
 476       BuildGroupOrs(D
.ParentVer()); 
 477       UpdateVerState(D
.ParentPkg()); 
 478       AddStates(D
.ParentPkg()); 
 482 // DepCache::Update - Update the related deps of a package              /*{{{*/ 
 483 // --------------------------------------------------------------------- 
 484 /* This is called whenever the state of a package changes. It updates 
 485    all cached dependencies related to this package. */ 
 486 void pkgDepCache::Update(PkgIterator 
const &Pkg
) 
 488    // Recompute the dep of the package 
 493    // Update the reverse deps 
 494    Update(Pkg
.RevDependsList()); 
 496    // Update the provides map for the current ver 
 497    if (Pkg
->CurrentVer 
!= 0) 
 498       for (PrvIterator P 
= Pkg
.CurrentVer().ProvidesList();  
 499            P
.end() != true; P
++) 
 500          Update(P
.ParentPkg().RevDependsList()); 
 502    // Update the provides map for the candidate ver 
 503    if (PkgState
[Pkg
->ID
].CandidateVer 
!= 0) 
 504       for (PrvIterator P 
= PkgState
[Pkg
->ID
].CandidateVerIter(*this).ProvidesList(); 
 505            P
.end() != true; P
++) 
 506          Update(P
.ParentPkg().RevDependsList()); 
 511 // DepCache::MarkKeep - Put the package in the keep state               /*{{{*/ 
 512 // --------------------------------------------------------------------- 
 514 void pkgDepCache::MarkKeep(PkgIterator 
const &Pkg
,bool Soft
) 
 516    // Simplifies other routines. 
 517    if (Pkg
.end() == true) 
 520    /* Reject an attempt to keep a non-source broken installed package, those 
 522    if (Pkg
.State() == PkgIterator::NeedsUnpack 
&&  
 523        Pkg
.CurrentVer().Downloadable() == false) 
 526    /* We changed the soft state all the time so the UI is a bit nicer 
 528    StateCache 
&P 
= PkgState
[Pkg
->ID
]; 
 530       P
.iFlags 
|= AutoKept
; 
 532       P
.iFlags 
&= ~AutoKept
; 
 534    // Check that it is not already kept 
 535    if (P
.Mode 
== ModeKeep
) 
 538    // We dont even try to keep virtual packages.. 
 539    if (Pkg
->VersionList 
== 0) 
 542    P
.Flags 
&= ~Flag::Auto
; 
 547    if (Pkg
->CurrentVer 
== 0) 
 550       P
.InstallVer 
= Pkg
.CurrentVer(); 
 559 // DepCache::MarkDelete - Put the package in the delete state           /*{{{*/ 
 560 // --------------------------------------------------------------------- 
 562 void pkgDepCache::MarkDelete(PkgIterator 
const &Pkg
, bool rPurge
) 
 564    // Simplifies other routines. 
 565    if (Pkg
.end() == true) 
 568    // Check that it is not already marked for delete 
 569    StateCache 
&P 
= PkgState
[Pkg
->ID
]; 
 570    P
.iFlags 
&= ~(AutoKept 
| Purge
); 
 574    if ((P
.Mode 
== ModeDelete 
|| P
.InstallVer 
== 0) &&  
 575        (Pkg
.Purge() == true || rPurge 
== false)) 
 578    // We dont even try to delete virtual packages.. 
 579    if (Pkg
->VersionList 
== 0) 
 585    if (Pkg
->CurrentVer 
== 0 && (Pkg
.Purge() == true || rPurge 
== false)) 
 590    P
.Flags 
&= Flag::Auto
; 
 597 // DepCache::MarkInstall - Put the package in the install state         /*{{{*/ 
 598 // --------------------------------------------------------------------- 
 600 void pkgDepCache::MarkInstall(PkgIterator 
const &Pkg
,bool AutoInst
, 
 601                               unsigned long Depth
, bool ForceImportantDeps
) 
 606    // Simplifies other routines. 
 607    if (Pkg
.end() == true) 
 610    /* Check that it is not already marked for install and that it can be  
 612    StateCache 
&P 
= PkgState
[Pkg
->ID
]; 
 613    P
.iFlags 
&= ~AutoKept
; 
 614    if ((P
.InstPolicyBroken() == false && P
.InstBroken() == false) &&  
 615        (P
.Mode 
== ModeInstall 
|| 
 616         P
.CandidateVer 
== (Version 
*)Pkg
.CurrentVer())) 
 618       if (P
.CandidateVer 
== (Version 
*)Pkg
.CurrentVer() && P
.InstallVer 
== 0) 
 623    // See if there is even any possible instalation candidate 
 624    if (P
.CandidateVer 
== 0) 
 626    // We dont even try to install virtual packages.. 
 627    if (Pkg
->VersionList 
== 0) 
 629    /* Target the candidate version and remove the autoflag. We reset the 
 630       autoflag below if this was called recursively. Otherwise the user 
 631       should have the ability to de-auto a package by changing its state */ 
 635    P
.Mode 
= ModeInstall
; 
 636    P
.InstallVer 
= P
.CandidateVer
; 
 637    P
.Flags 
&= ~Flag::Auto
; 
 638    if (P
.CandidateVer 
== (Version 
*)Pkg
.CurrentVer()) 
 645    if (AutoInst 
== false) 
 648    DepIterator Dep 
= P
.InstVerIter(*this).DependsList(); 
 649    for (; Dep
.end() != true;) 
 652       DepIterator Start 
= Dep
; 
 655       for (bool LastOR 
= true; Dep
.end() == false && LastOR 
== true; Dep
++,Ors
++) 
 657          LastOR 
= (Dep
->CompareOp 
& Dep::Or
) == Dep::Or
; 
 659          if ((DepState
[Dep
->ID
] & DepInstall
) == DepInstall
) 
 663       // Dep is satisfied okay. 
 667       /* Check if this dep should be consider for install. If it is a user 
 668          defined important dep and we are installed a new package then  
 669          it will be installed. Otherwise we only check for important 
 670          deps that have changed from the installed version 
 672       if (IsImportantDep(Start
) == false) 
 675       /* check if any ImportantDep() (but not Critial) where added 
 676        * since we installed the package 
 678       bool isNewImportantDep 
= false; 
 679       if(!ForceImportantDeps 
&& !Start
.IsCritical()) 
 682          VerIterator instVer 
= Pkg
.CurrentVer(); 
 684             for (DepIterator D 
= instVer
.DependsList(); D
.end() != true; D
++) 
 686                //FIXME: deal better with or-groups(?) 
 687                DepIterator LocalStart 
= D
; 
 689                if(IsImportantDep(D
) && Start
.TargetPkg() == D
.TargetPkg()) 
 692          // this is a new dep if it was not found to be already 
 693          // a important dep of the installed pacakge 
 694          isNewImportantDep 
= !found
; 
 696       if(isNewImportantDep
) 
 697          if(_config
->FindB("Debug::pkgDepCache::AutoInstall",false) == true) 
 698             std::clog 
<< "new important dependency: "  
 699                       << Start
.TargetPkg().Name() << std::endl
; 
 701       // skip important deps if the package is already installed 
 702       if (Pkg
->CurrentVer 
!= 0 && Start
.IsCritical() == false  
 703           && !isNewImportantDep 
&& !ForceImportantDeps
) 
 706       /* If we are in an or group locate the first or that can  
 707          succeed. We have already cached this.. */ 
 708       for (; Ors 
> 1 && (DepState
[Start
->ID
] & DepCVer
) != DepCVer
; Ors
--) 
 711       /* This bit is for processing the possibilty of an install/upgrade 
 712          fixing the problem */ 
 713       SPtrArray
<Version 
*> List 
= Start
.AllTargets(); 
 714       if ((DepState
[Start
->ID
] & DepCVer
) == DepCVer
) 
 716          // Right, find the best version to install.. 
 717          Version 
**Cur 
= List
; 
 718          PkgIterator P 
= Start
.TargetPkg(); 
 719          PkgIterator 
InstPkg(*Cache
,0); 
 721          // See if there are direct matches (at the start of the list) 
 722          for (; *Cur 
!= 0 && (*Cur
)->ParentPkg 
== P
.Index(); Cur
++) 
 724             PkgIterator 
Pkg(*Cache
,Cache
->PkgP 
+ (*Cur
)->ParentPkg
); 
 725             if (PkgState
[Pkg
->ID
].CandidateVer 
!= *Cur
) 
 731          // Select the highest priority providing package 
 732          if (InstPkg
.end() == true) 
 734             pkgPrioSortList(*Cache
,Cur
); 
 735             for (; *Cur 
!= 0; Cur
++) 
 737                PkgIterator 
Pkg(*Cache
,Cache
->PkgP 
+ (*Cur
)->ParentPkg
); 
 738                if (PkgState
[Pkg
->ID
].CandidateVer 
!= *Cur
) 
 745          if (InstPkg
.end() == false) 
 747             if(_config
->FindB("Debug::pkgDepCache::AutoInstall",false) == true) 
 748                std::clog 
<< "Installing " << InstPkg
.Name()  
 749                          << " as dep of " << Pkg
.Name()  
 751             MarkInstall(InstPkg
,true,Depth 
+ 1, ForceImportantDeps
); 
 753             // Set the autoflag, after MarkInstall because MarkInstall unsets it 
 754             if (P
->CurrentVer 
== 0) 
 755                PkgState
[InstPkg
->ID
].Flags 
|= Flag::Auto
; 
 761       /* For conflicts we just de-install the package and mark as auto, 
 762          Conflicts may not have or groups */ 
 763       if (Start
->Type 
== Dep::Conflicts 
|| Start
->Type 
== Dep::Obsoletes
) 
 765          for (Version 
**I 
= List
; *I 
!= 0; I
++) 
 767             VerIterator 
Ver(*this,*I
); 
 768             PkgIterator Pkg 
= Ver
.ParentPkg(); 
 771             PkgState
[Pkg
->ID
].Flags 
|= Flag::Auto
; 
 778 // DepCache::SetReInstall - Set the reinstallation flag                 /*{{{*/ 
 779 // --------------------------------------------------------------------- 
 781 void pkgDepCache::SetReInstall(PkgIterator 
const &Pkg
,bool To
) 
 786    StateCache 
&P 
= PkgState
[Pkg
->ID
]; 
 788       P
.iFlags 
|= ReInstall
; 
 790       P
.iFlags 
&= ~ReInstall
; 
 796 // DepCache::SetCandidateVersion - Change the candidate version         /*{{{*/ 
 797 // --------------------------------------------------------------------- 
 799 void pkgDepCache::SetCandidateVersion(VerIterator TargetVer
) 
 801    pkgCache::PkgIterator Pkg 
= TargetVer
.ParentPkg(); 
 802    StateCache 
&P 
= PkgState
[Pkg
->ID
]; 
 807    if (P
.CandidateVer 
== P
.InstallVer
) 
 808       P
.InstallVer 
= (Version 
*)TargetVer
; 
 809    P
.CandidateVer 
= (Version 
*)TargetVer
; 
 817 // StateCache::Update - Compute the various static display things       /*{{{*/ 
 818 // --------------------------------------------------------------------- 
 819 /* This is called whenever the Candidate version changes. */ 
 820 void pkgDepCache::StateCache::Update(PkgIterator Pkg
,pkgCache 
&Cache
) 
 823    VerIterator Ver 
= CandidateVerIter(Cache
); 
 825    // Use a null string or the version string 
 826    if (Ver
.end() == true) 
 829       CandVersion 
= Ver
.VerStr(); 
 831    // Find the current version 
 833    if (Pkg
->CurrentVer 
!= 0) 
 834       CurVersion 
= Pkg
.CurrentVer().VerStr(); 
 836    // Strip off the epochs for display 
 837    CurVersion 
= StripEpoch(CurVersion
); 
 838    CandVersion 
= StripEpoch(CandVersion
); 
 840    // Figure out if its up or down or equal 
 841    Status 
= Ver
.CompareVer(Pkg
.CurrentVer()); 
 842    if (Pkg
->CurrentVer 
== 0 || Pkg
->VersionList 
== 0 || CandidateVer 
== 0) 
 846 // StateCache::StripEpoch - Remove the epoch specifier from the version /*{{{*/ 
 847 // --------------------------------------------------------------------- 
 849 const char *pkgDepCache::StateCache::StripEpoch(const char *Ver
) 
 855    for (const char *I 
= Ver
; *I 
!= 0; I
++) 
 862 // Policy::GetCandidateVer - Returns the Candidate install version      /*{{{*/ 
 863 // --------------------------------------------------------------------- 
 864 /* The default just returns the highest available version that is not 
 865    a source and automatic. */ 
 866 pkgCache::VerIterator 
pkgDepCache::Policy::GetCandidateVer(PkgIterator Pkg
) 
 868    /* Not source/not automatic versions cannot be a candidate version  
 869       unless they are already installed */ 
 870    VerIterator 
Last(*(pkgCache 
*)this,0); 
 872    for (VerIterator I 
= Pkg
.VersionList(); I
.end() == false; I
++) 
 874       if (Pkg
.CurrentVer() == I
) 
 877       for (VerFileIterator J 
= I
.FileList(); J
.end() == false; J
++) 
 879          if ((J
.File()->Flags 
& Flag::NotSource
) != 0) 
 882          /* Stash the highest version of a not-automatic source, we use it 
 883             if there is nothing better */ 
 884          if ((J
.File()->Flags 
& Flag::NotAutomatic
) != 0) 
 886             if (Last
.end() == true) 
 898 // Policy::IsImportantDep - True if the dependency is important         /*{{{*/ 
 899 // --------------------------------------------------------------------- 
 901 bool pkgDepCache::Policy::IsImportantDep(DepIterator Dep
) 
 905    else if(Dep
->Type 
== pkgCache::Dep::Recommends
) 
 906       return  _config
->FindB("APT::Install-Recommends", false); 
 907    else if(Dep
->Type 
== pkgCache::Dep::Suggests
) 
 908      return _config
->FindB("APT::Install-Suggests", false);