]>
git.saurik.com Git - apt.git/blob - apt-pkg/packagemanager.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: packagemanager.cc,v 1.30 2003/04/27 03:04:15 doogie Exp $
4 /* ######################################################################
6 Package Manager - Abstacts the package manager
8 More work is needed in the area of transitioning provides, ie exim
9 replacing smail. This can cause interesing side effects.
11 Other cases involving conflicts+replaces should be tested.
13 ##################################################################### */
15 // Include Files /*{{{*/
18 #include <apt-pkg/packagemanager.h>
19 #include <apt-pkg/orderlist.h>
20 #include <apt-pkg/depcache.h>
21 #include <apt-pkg/error.h>
22 #include <apt-pkg/version.h>
23 #include <apt-pkg/acquire-item.h>
24 #include <apt-pkg/algorithms.h>
25 #include <apt-pkg/configuration.h>
26 #include <apt-pkg/sptr.h>
27 #include <apt-pkg/macros.h>
28 #include <apt-pkg/pkgcache.h>
29 #include <apt-pkg/cacheiterators.h>
30 #include <apt-pkg/strutl.h>
41 bool pkgPackageManager :: SigINTStop
= false ;
43 // PM::PackageManager - Constructor /*{{{*/
44 // ---------------------------------------------------------------------
46 pkgPackageManager :: pkgPackageManager ( pkgDepCache
* pCache
) : Cache (* pCache
),
47 List ( NULL
), Res ( Incomplete
)
49 FileNames
= new string
[ Cache
. Head (). PackageCount
];
50 Debug
= _config
-> FindB ( "Debug::pkgPackageManager" , false );
51 NoImmConfigure
= ! _config
-> FindB ( "APT::Immediate-Configure" , true );
52 ImmConfigureAll
= _config
-> FindB ( "APT::Immediate-Configure-All" , false );
55 // PM::PackageManager - Destructor /*{{{*/
56 // ---------------------------------------------------------------------
58 pkgPackageManager ::~ pkgPackageManager ()
64 // PM::GetArchives - Queue the archives for download /*{{{*/
65 // ---------------------------------------------------------------------
67 bool pkgPackageManager :: GetArchives ( pkgAcquire
* Owner
, pkgSourceList
* Sources
,
70 if ( CreateOrderList () == false )
74 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
75 List
-> OrderUnpack () : List
-> OrderCritical ();
76 if ( ordering
== false )
77 return _error
-> Error ( "Internal ordering error" );
79 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
81 PkgIterator
Pkg ( Cache
,* I
);
82 FileNames
[ Pkg
-> ID
] = string ();
84 // Skip packages to erase
85 if ( Cache
[ Pkg
]. Delete () == true )
88 // Skip Packages that need configure only.
89 if ( Pkg
. State () == pkgCache :: PkgIterator :: NeedsConfigure
&&
90 Cache
[ Pkg
]. Keep () == true )
93 // Skip already processed packages
94 if ( List
-> IsNow ( Pkg
) == false )
97 new pkgAcqArchive ( Owner
, Sources
, Recs
, Cache
[ Pkg
]. InstVerIter ( Cache
),
104 // PM::FixMissing - Keep all missing packages /*{{{*/
105 // ---------------------------------------------------------------------
106 /* This is called to correct the installation when packages could not
108 bool pkgPackageManager :: FixMissing ()
110 pkgDepCache :: ActionGroup
group ( Cache
);
111 pkgProblemResolver
Resolve (& Cache
);
112 List
-> SetFileList ( FileNames
);
115 for ( PkgIterator I
= Cache
. PkgBegin (); I
. end () == false ; ++ I
)
117 if ( List
-> IsMissing ( I
) == false )
120 // Okay, this file is missing and we need it. Mark it for keep
122 Cache
. MarkKeep ( I
, false , false );
125 // We have to empty the list otherwise it will not have the new changes
132 // Now downgrade everything that is broken
133 return Resolve
. ResolveByKeep () == true && Cache
. BrokenCount () == 0 ;
136 // PM::ImmediateAdd - Add the immediate flag recursivly /*{{{*/
137 // ---------------------------------------------------------------------
138 /* This adds the immediate flag to the pkg and recursively to the
141 void pkgPackageManager :: ImmediateAdd ( PkgIterator I
, bool UseInstallVer
, unsigned const int & Depth
)
147 if ( Cache
[ I
]. InstallVer
== 0 )
149 D
= Cache
[ I
]. InstVerIter ( Cache
). DependsList ();
151 if ( I
-> CurrentVer
== 0 )
153 D
= I
. CurrentVer (). DependsList ();
156 for ( /* nothing */ ; D
. end () == false ; ++ D
)
157 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
159 if (! List
-> IsFlag ( D
. TargetPkg (), pkgOrderList :: Immediate
))
162 clog
<< OutputInDepth ( Depth
) << "ImmediateAdd(): Adding Immediate flag to " << D
. TargetPkg () << " cause of " << D
. DepType () << " " << I
. FullName () << endl
;
163 List
-> Flag ( D
. TargetPkg (), pkgOrderList :: Immediate
);
164 ImmediateAdd ( D
. TargetPkg (), UseInstallVer
, Depth
+ 1 );
170 // PM::CreateOrderList - Create the ordering class /*{{{*/
171 // ---------------------------------------------------------------------
172 /* This populates the ordering list with all the packages that are
174 bool pkgPackageManager :: CreateOrderList ()
180 List
= new pkgOrderList (& Cache
);
182 if ( Debug
&& ImmConfigureAll
)
183 clog
<< "CreateOrderList(): Adding Immediate flag for all packages because of APT::Immediate-Configure-All" << endl
;
185 // Generate the list of affected packages and sort it
186 for ( PkgIterator I
= Cache
. PkgBegin (); I
. end () == false ; ++ I
)
188 // Ignore no-version packages
189 if ( I
-> VersionList
== 0 )
192 // Mark the package and its dependends for immediate configuration
193 if (((( I
-> Flags
& pkgCache :: Flag :: Essential
) == pkgCache :: Flag :: Essential
) &&
194 NoImmConfigure
== false ) || ImmConfigureAll
)
196 if ( Debug
&& ! ImmConfigureAll
)
197 clog
<< "CreateOrderList(): Adding Immediate flag for " << I
. FullName () << endl
;
198 List
-> Flag ( I
, pkgOrderList :: Immediate
);
200 if (! ImmConfigureAll
) {
201 // Look for other install packages to make immediate configurea
202 ImmediateAdd ( I
, true );
204 // And again with the current version.
205 ImmediateAdd ( I
, false );
210 if (( Cache
[ I
]. Keep () == true ||
211 Cache
[ I
]. InstVerIter ( Cache
) == I
. CurrentVer ()) &&
212 I
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
213 ( Cache
[ I
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
&&
214 ( I
. Purge () != false || Cache
[ I
]. Mode
!= pkgDepCache :: ModeDelete
||
215 ( Cache
[ I
]. iFlags
& pkgDepCache :: Purge
) != pkgDepCache :: Purge
))
218 // Append it to the list
225 // PM::DepAlwaysTrue - Returns true if this dep is irrelevant /*{{{*/
226 // ---------------------------------------------------------------------
227 /* The restriction on provides is to eliminate the case when provides
228 are transitioning between valid states [ie exim to smail] */
229 bool pkgPackageManager :: DepAlwaysTrue ( DepIterator D
)
231 if ( D
. TargetPkg ()-> ProvidesList
!= 0 )
234 if (( Cache
[ D
] & pkgDepCache :: DepInstall
) != 0 &&
235 ( Cache
[ D
] & pkgDepCache :: DepNow
) != 0 )
240 // PM::CheckRConflicts - Look for reverse conflicts /*{{{*/
241 // ---------------------------------------------------------------------
242 /* This looks over the reverses for a conflicts line that needs early
244 bool pkgPackageManager :: CheckRConflicts ( PkgIterator Pkg
, DepIterator D
,
247 for (; D
. end () == false ; ++ D
)
249 if ( D
-> Type
!= pkgCache :: Dep :: Conflicts
&&
250 D
-> Type
!= pkgCache :: Dep :: Obsoletes
)
253 // The package hasn't been changed
254 if ( List
-> IsNow ( Pkg
) == false )
257 // Ignore self conflicts, ignore conflicts from irrelevant versions
258 if ( D
. IsIgnorable ( Pkg
) || D
. ParentVer () != D
. ParentPkg (). CurrentVer ())
261 if ( Cache
. VS (). CheckDep ( Ver
, D
-> CompareOp
, D
. TargetVer ()) == false )
264 if ( EarlyRemove ( D
. ParentPkg (), & D
) == false )
265 return _error
-> Error ( "Reverse conflicts early remove for package ' %s ' failed" ,
266 Pkg
. FullName (). c_str ());
271 // PM::ConfigureAll - Run the all out configuration /*{{{*/
272 // ---------------------------------------------------------------------
273 /* This configures every package. It is assumed they are all unpacked and
274 that the final configuration is valid. This is also used to catch packages
275 that have not been configured when using ImmConfigureAll */
276 bool pkgPackageManager :: ConfigureAll ()
278 pkgOrderList
OList (& Cache
);
280 // Populate the order list
281 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
282 if ( List
-> IsFlag ( pkgCache :: PkgIterator ( Cache
,* I
),
283 pkgOrderList :: UnPacked
) == true )
286 if ( OList
. OrderConfigure () == false )
289 std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
290 bool const ConfigurePkgs
= ( conf
== "all" );
292 // Perform the configuring
293 for ( pkgOrderList :: iterator I
= OList
. begin (); I
!= OList
. end (); ++ I
)
295 PkgIterator
Pkg ( Cache
,* I
);
297 /* Check if the package has been configured, this can happen if SmartConfigure
299 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
)) continue ;
301 if ( ConfigurePkgs
== true && SmartConfigure ( Pkg
, 0 ) == false ) {
303 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
304 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 1 );
306 _error
-> Error ( "Internal error, packages left unconfigured. %s " , Pkg
. FullName (). c_str ());
310 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
316 // PM::NonLoopingSmart - helper to avoid loops while calling Smart methods /*{{{*/
317 // -----------------------------------------------------------------------
318 /* ensures that a loop of the form A depends B, B depends A (and similar)
319 is not leading us down into infinite recursion segfault land */
320 bool pkgPackageManager :: NonLoopingSmart ( SmartAction
const action
, pkgCache :: PkgIterator
& Pkg
,
321 pkgCache :: PkgIterator DepPkg
, int const Depth
, bool const PkgLoop
,
322 bool * const Bad
, bool * const Changed
)
324 if ( PkgLoop
== false )
325 List
-> Flag ( Pkg
, pkgOrderList :: Loop
);
326 bool success
= false ;
329 case UNPACK_IMMEDIATE
: success
= SmartUnPack ( DepPkg
, true , Depth
+ 1 ); break ;
330 case UNPACK
: success
= SmartUnPack ( DepPkg
, false , Depth
+ 1 ); break ;
331 case CONFIGURE
: success
= SmartConfigure ( DepPkg
, Depth
+ 1 ); break ;
333 if ( PkgLoop
== false )
334 List
-> RmFlag ( Pkg
, pkgOrderList :: Loop
);
336 if ( success
== false )
341 if ( Changed
!= NULL
&& List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) == false )
346 // PM::SmartConfigure - Perform immediate configuration of the pkg /*{{{*/
347 // ---------------------------------------------------------------------
348 /* This function tries to put the system in a state where Pkg can be configured.
349 This involves checking each of Pkg's dependencies and unpacking and
350 configuring packages where needed. */
351 bool pkgPackageManager :: SmartConfigure ( PkgIterator Pkg
, int const Depth
)
353 // If this is true, only check and correct and dependencies without the Loop flag
354 bool const PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
357 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
358 clog
<< OutputInDepth ( Depth
) << "SmartConfigure " << Pkg
. FullName () << " (" << InstallVer
. VerStr () << ")" ;
360 clog
<< " (Only Correct Dependencies)" ;
364 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
366 /* Because of the ordered list, most dependencies should be unpacked,
367 however if there is a loop (A depends on B, B depends on A) this will not
368 be the case, so check for dependencies before configuring. */
369 bool Bad
= false , Changed
= false ;
370 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
372 std :: list
< DepIterator
> needConfigure
;
376 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
378 // Compute a single dependency element (glob or)
379 pkgCache :: DepIterator Start
, End
;
382 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
386 // Check for dependencies that have not been unpacked, probably due to loops.
387 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
389 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
391 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
393 VerIterator
Ver ( Cache
,* I
);
394 PkgIterator DepPkg
= Ver
. ParentPkg ();
396 // Check if the current version of the package is available and will satisfy this dependency
397 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
398 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
399 DepPkg
. State () == PkgIterator :: NeedsNothing
)
405 // Check if the version that is going to be installed will satisfy the dependency
406 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
412 std :: clog
<< OutputInDepth ( Depth
) << "Package " << Pkg
<< " loops in SmartConfigure" << std :: endl
;
418 clog
<< OutputInDepth ( Depth
) << "Unpacking " << DepPkg
. FullName () << " to avoid loop " << Cur
<< endl
;
419 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
425 if ( Cur
== End
|| Bad
== false )
432 needConfigure
. push_back ( Start
);
435 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (1) for %s , aborting" , Pkg
. FullName (). c_str ());
436 } while ( Changed
== true );
438 Bad
= false , Changed
= false , i
= 0 ;
442 for ( std :: list
< DepIterator
>:: const_iterator D
= needConfigure
. begin (); D
!= needConfigure
. end (); ++ D
)
444 // Compute a single dependency element (glob or) without modifying D
445 pkgCache :: DepIterator Start
, End
;
447 pkgCache :: DepIterator Discard
= * D
;
448 Discard
. GlobOr ( Start
, End
);
451 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
455 // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
456 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
458 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
460 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
462 VerIterator
Ver ( Cache
,* I
);
463 PkgIterator DepPkg
= Ver
. ParentPkg ();
465 // Check if the version that is going to be installed will satisfy the dependency
466 if ( Cache
[ DepPkg
]. InstallVer
!= * I
)
469 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
))
471 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) && PkgLoop
)
473 // This dependency has already been dealt with by another SmartConfigure on Pkg
478 std :: clog
<< OutputInDepth ( Depth
) << "Configure already unpacked " << DepPkg
<< std :: endl
;
479 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
484 else if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
490 if ( Cur
== End
|| Bad
== false )
495 if ( Bad
== true && Changed
== false && Debug
== true )
496 std :: clog
<< OutputInDepth ( Depth
) << "Could not satisfy " << * D
<< std :: endl
;
499 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (2) for %s , aborting" , Pkg
. FullName (). c_str ());
500 } while ( Changed
== true );
503 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
505 if ( PkgLoop
) return true ;
507 static std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
508 static bool const ConfigurePkgs
= ( conf
== "all" || conf
== "smart" );
510 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
))
511 return _error
-> Error ( "Internal configure error on ' %s '." , Pkg
. FullName (). c_str ());
513 if ( ConfigurePkgs
== true && Configure ( Pkg
) == false )
516 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
518 if (( Cache
[ Pkg
]. InstVerIter ( Cache
)-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
519 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
520 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
522 if ( Pkg
== P
|| List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
523 List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == false ||
524 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
525 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
527 if ( SmartConfigure ( P
, ( Depth
+ 1 )) == false )
532 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
) == false )
533 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
538 // PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
539 // ---------------------------------------------------------------------
540 /* This is called to deal with conflicts arising from unpacking */
541 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
)
543 return EarlyRemove ( Pkg
, NULL
);
545 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
, DepIterator
const * const Dep
)
547 if ( List
-> IsNow ( Pkg
) == false )
550 // Already removed it
551 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
554 // Woops, it will not be re-installed!
555 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: InList
) == false )
558 // these breaks on M-A:same packages can be dealt with. They 'loop' by design
559 if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
&& Dep
-> IsMultiArchImplicit () == true )
562 // Essential packages get special treatment
563 bool IsEssential
= false ;
564 if (( Pkg
-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
565 ( Pkg
-> Flags
& pkgCache :: Flag :: Important
) != 0 )
568 /* Check for packages that are the dependents of essential packages and
570 if ( Pkg
-> CurrentVer
!= 0 )
572 for ( pkgCache :: DepIterator D
= Pkg
. RevDependsList (); D
. end () == false &&
573 IsEssential
== false ; ++ D
)
574 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
575 if (( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
576 ( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Important
) != 0 )
580 if ( IsEssential
== true )
582 if ( _config
-> FindB ( "APT::Force-LoopBreak" , false ) == false )
583 return _error
-> Error ( _ ( "This installation run will require temporarily "
584 "removing the essential package %s due to a "
585 "Conflicts/Pre-Depends loop. This is often bad, "
586 "but if you really want to do it, activate the "
587 "APT::Force-LoopBreak option." ), Pkg
. FullName (). c_str ());
589 // dpkg will auto-deconfigure it, no need for the big remove hammer
590 else if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
)
593 bool Res
= SmartRemove ( Pkg
);
594 if ( Cache
[ Pkg
]. Delete () == false )
595 List
-> Flag ( Pkg
, pkgOrderList :: Removed
, pkgOrderList :: States
);
600 // PM::SmartRemove - Removal Helper /*{{{*/
601 // ---------------------------------------------------------------------
603 bool pkgPackageManager :: SmartRemove ( PkgIterator Pkg
)
605 if ( List
-> IsNow ( Pkg
) == false )
608 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
610 return Remove ( Pkg
,( Cache
[ Pkg
]. iFlags
& pkgDepCache :: Purge
) == pkgDepCache :: Purge
);
613 // PM::SmartUnPack - Install helper /*{{{*/
614 // ---------------------------------------------------------------------
615 /* This puts the system in a state where it can Unpack Pkg, if Pkg is already
616 unpacked, or when it has been unpacked, if Immediate==true it configures it. */
617 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
)
619 return SmartUnPack ( Pkg
, true , 0 );
621 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
, bool const Immediate
, int const Depth
)
623 bool PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
626 clog
<< OutputInDepth ( Depth
) << "SmartUnPack " << Pkg
. FullName ();
627 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
628 if ( Pkg
. CurrentVer () == 0 )
629 clog
<< " (install version " << InstallVer
. VerStr () << ")" ;
631 clog
<< " (replace version " << Pkg
. CurrentVer (). VerStr () << " with " << InstallVer
. VerStr () << ")" ;
633 clog
<< " (Only Perform PreUnpack Checks)" ;
635 clog
<< " immediately" ;
639 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
641 /* PreUnpack Checks: This loop checks and attempts to rectify any problems that would prevent the package being unpacked.
642 It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
643 avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
644 complex dependency structures, trying to configure some packages while breaking the loops can complicate things.
645 This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
646 or by the ConfigureAll call at the end of the for loop in OrderInstall. */
647 bool SomethingBad
= false , Changed
= false ;
648 bool couldBeTemporaryRemoved
= Depth
!= 0 && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == false ;
649 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
654 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
656 // Compute a single dependency element (glob or)
657 pkgCache :: DepIterator Start
, End
;
660 if ( End
-> Type
== pkgCache :: Dep :: PreDepends
)
664 clog
<< OutputInDepth ( Depth
) << "PreDepends order for " << Pkg
. FullName () << std :: endl
;
666 // Look for easy targets: packages that are already okay
667 for ( DepIterator Cur
= Start
; Bad
== true ; ++ Cur
)
669 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
670 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
672 VerIterator
Ver ( Cache
,* I
);
673 PkgIterator Pkg
= Ver
. ParentPkg ();
675 // See if the current version is ok
676 if ( Pkg
. CurrentVer () == Ver
&& List
-> IsNow ( Pkg
) == true &&
677 Pkg
. State () == PkgIterator :: NeedsNothing
)
681 clog
<< OutputInDepth ( Depth
) << "Found ok package " << Pkg
. FullName () << endl
;
689 // Look for something that could be configured.
690 for ( DepIterator Cur
= Start
; Bad
== true && Cur
. end () == false ; ++ Cur
)
692 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
693 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
695 VerIterator
Ver ( Cache
,* I
);
696 PkgIterator DepPkg
= Ver
. ParentPkg ();
698 // Not the install version
699 if ( Cache
[ DepPkg
]. InstallVer
!= * I
||
700 ( Cache
[ DepPkg
]. Keep () == true && DepPkg
. State () == PkgIterator :: NeedsNothing
))
703 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
709 // check if it needs unpack or if if configure is enough
710 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
) == false )
713 clog
<< OutputInDepth ( Depth
) << "Trying to SmartUnpack " << DepPkg
. FullName () << endl
;
714 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
720 clog
<< OutputInDepth ( Depth
) << "Trying to SmartConfigure " << DepPkg
. FullName () << endl
;
721 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
731 else if ( End
-> Type
== pkgCache :: Dep :: Conflicts
||
732 End
-> Type
== pkgCache :: Dep :: Obsoletes
||
733 End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
735 SPtrArray
< Version
*> VList
= End
. AllTargets ();
736 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
738 VerIterator
Ver ( Cache
,* I
);
739 PkgIterator ConflictPkg
= Ver
. ParentPkg ();
740 if ( ConflictPkg
. CurrentVer () != Ver
)
743 std :: clog
<< OutputInDepth ( Depth
) << "Ignore not-installed version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
747 if ( List
-> IsNow ( ConflictPkg
) == false )
750 std :: clog
<< OutputInDepth ( Depth
) << "Ignore already dealt-with version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
754 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
757 clog
<< OutputInDepth ( Depth
) << "Ignoring " << End
<< " as " << ConflictPkg
. FullName () << "was temporarily removed" << endl
;
761 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Loop
) && PkgLoop
)
763 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
&& End
. IsMultiArchImplicit () == true )
766 clog
<< OutputInDepth ( Depth
) << "Because dependency is MultiArchImplicit we ignored looping on: " << ConflictPkg
<< endl
;
771 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
772 clog
<< OutputInDepth ( Depth
) << "Because of breaks knot, deconfigure " << ConflictPkg
. FullName () << " temporarily" << endl
;
774 clog
<< OutputInDepth ( Depth
) << "Because of conflict knot, removing " << ConflictPkg
. FullName () << " temporarily" << endl
;
776 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
777 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
782 if ( Cache
[ ConflictPkg
]. Delete () == false )
786 clog
<< OutputInDepth ( Depth
) << "Unpacking " << ConflictPkg
. FullName () << " to avoid " << End
;
788 clog
<< " (Looping)" ;
791 // we would like to avoid temporary removals and all that at best via a simple unpack
792 _error
-> PushToStack ();
793 if ( NonLoopingSmart ( UNPACK
, Pkg
, ConflictPkg
, Depth
, PkgLoop
, NULL
, & Changed
) == false )
795 // but if it fails ignore this failure and look for alternative ways of solving
798 clog
<< OutputInDepth ( Depth
) << "Avoidance unpack of " << ConflictPkg
. FullName () << " failed for " << End
<< std :: endl
;
799 _error
-> DumpErrors ( std :: clog
);
801 _error
-> RevertToStack ();
802 // ignorance can only happen if a) one of the offenders is already gone
803 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
806 clog
<< OutputInDepth ( Depth
) << "But " << ConflictPkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
808 else if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
811 clog
<< OutputInDepth ( Depth
) << "But " << Pkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
813 // or b) we can make one go (removal or dpkg auto-deconfigure)
817 clog
<< OutputInDepth ( Depth
) << "So temprorary remove/deconfigure " << ConflictPkg
. FullName () << " to satisfy " << End
<< endl
;
818 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
819 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
823 _error
-> MergeWithStack ();
828 clog
<< OutputInDepth ( Depth
) << "Removing " << ConflictPkg
. FullName () << " now to avoid " << End
<< endl
;
829 // no earlyremove() here as user has already agreed to the permanent removal
830 if ( SmartRemove ( Pkg
) == false )
831 return _error
-> Error ( "Internal Error, Could not early remove %s (1)" , ConflictPkg
. FullName (). c_str ());
837 return _error
-> Error ( "Internal error: APT::pkgPackageManager::MaxLoopCount reached in SmartConfigure for %s , aborting" , Pkg
. FullName (). c_str ());
838 } while ( Changed
== true );
840 if ( SomethingBad
== true )
841 return _error
-> Error ( "Couldn't configure %s , probably a dependency cycle." , Pkg
. FullName (). c_str ());
843 if ( couldBeTemporaryRemoved
== true && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
846 std :: clog
<< OutputInDepth ( Depth
) << "Prevent unpack as " << Pkg
<< " is currently temporarily removed" << std :: endl
;
850 // Check for reverse conflicts.
851 if ( CheckRConflicts ( Pkg
, Pkg
. RevDependsList (),
852 instVer
. VerStr ()) == false )
855 for ( PrvIterator P
= instVer
. ProvidesList ();
856 P
. end () == false ; ++ P
)
857 if ( Pkg
-> Group
!= P
. OwnerPkg ()-> Group
)
858 CheckRConflicts ( Pkg
, P
. ParentPkg (). RevDependsList (), P
. ProvideVersion ());
863 List
-> Flag ( Pkg
, pkgOrderList :: UnPacked
, pkgOrderList :: States
);
865 if ( Immediate
== true && ( instVer
-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
867 /* Do lockstep M-A:same unpacking in two phases:
868 First unpack all installed architectures, then the not installed.
869 This way we avoid that M-A: enabled packages are installed before
870 their older non-M-A enabled packages are replaced by newer versions */
871 bool const installed
= Pkg
-> CurrentVer
!= 0 ;
872 if ( installed
== true &&
873 ( instVer
!= Pkg
. CurrentVer () ||
874 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
875 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
877 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
878 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
880 if ( P
-> CurrentVer
== 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
881 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
882 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
884 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
887 if ( installed
== false && Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
889 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
890 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
892 if ( P
-> CurrentVer
!= 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
893 List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
894 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
895 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
897 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
901 // packages which are already unpacked don't need to be unpacked again
902 else if (( instVer
!= Pkg
. CurrentVer () ||
903 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
904 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
907 if ( Immediate
== true ) {
908 // Perform immedate configuration of the package.
909 if ( SmartConfigure ( Pkg
, Depth
+ 1 ) == false )
910 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
911 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 2 );
917 // PM::OrderInstall - Installation ordering routine /*{{{*/
918 // ---------------------------------------------------------------------
920 pkgPackageManager :: OrderResult
pkgPackageManager :: OrderInstall ()
922 if ( CreateOrderList () == false )
928 clog
<< "Beginning to order" << endl
;
930 bool const ordering
=
931 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
932 List
-> OrderUnpack ( FileNames
) : List
-> OrderCritical ();
933 if ( ordering
== false )
935 _error
-> Error ( "Internal ordering error" );
940 clog
<< "Done ordering" << endl
;
942 bool DoneSomething
= false ;
943 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
945 PkgIterator
Pkg ( Cache
,* I
);
947 if ( List
-> IsNow ( Pkg
) == false )
950 clog
<< "Skipping already done " << Pkg
. FullName () << endl
;
954 if ( List
-> IsMissing ( Pkg
) == true )
957 clog
<< "Sequence completed at " << Pkg
. FullName () << endl
;
958 if ( DoneSomething
== false )
960 _error
-> Error ( "Internal Error, ordering was unable to handle the media swap" );
967 if ( Cache
[ Pkg
]. Keep () == true &&
968 Pkg
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
969 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
971 _error
-> Error ( "Internal Error, trying to manipulate a kept package ( %s )" , Pkg
. FullName (). c_str ());
975 // Perform a delete or an install
976 if ( Cache
[ Pkg
]. Delete () == true )
978 if ( SmartRemove ( Pkg
) == false )
982 if ( SmartUnPack ( Pkg
, List
-> IsFlag ( Pkg
, pkgOrderList :: Immediate
), 0 ) == false )
984 DoneSomething
= true ;
986 if ( ImmConfigureAll
) {
987 /* ConfigureAll here to pick up and packages left unconfigured because they were unpacked in the
988 "PreUnpack Checks" section */
994 // Final run through the configure phase
995 if ( ConfigureAll () == false )
999 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
1001 if ( List
-> IsFlag (* I
, pkgOrderList :: Configured
) == false )
1003 _error
-> Error ( "Internal error, packages left unconfigured. %s " ,
1004 PkgIterator ( Cache
,* I
). FullName (). c_str ());
1011 // PM::DoInstallPostFork - compat /*{{{*/
1012 // ---------------------------------------------------------------------
1014 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1015 pkgPackageManager :: OrderResult
1016 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1018 APT :: Progress :: PackageManager
* progress
= new
1019 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1020 pkgPackageManager :: OrderResult res
= DoInstallPostFork ( progress
);
1025 // PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
1026 // ---------------------------------------------------------------------
1027 pkgPackageManager :: OrderResult
1028 pkgPackageManager :: DoInstallPostFork ( APT :: Progress :: PackageManager
* progress
)
1030 bool goResult
= Go ( progress
);
1031 if ( goResult
== false )
1037 pkgPackageManager :: OrderResult
1038 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1040 bool goResult
= Go ( statusFd
);
1041 if ( goResult
== false )
1048 // PM::DoInstall - Does the installation /*{{{*/
1049 // ---------------------------------------------------------------------
1051 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1052 pkgPackageManager :: OrderResult
1053 pkgPackageManager :: DoInstall ( int statusFd
)
1055 APT :: Progress :: PackageManager
* progress
= new
1056 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1057 OrderResult res
= DoInstall ( progress
);
1062 pkgPackageManager :: OrderResult
pkgPackageManager :: DoInstall ( int statusFd
)
1064 if ( DoInstallPreFork () == Failed
)
1067 return DoInstallPostFork ( statusFd
);
1071 // PM::DoInstall - Does the installation /*{{{*/
1072 // ---------------------------------------------------------------------
1073 /* This uses the filenames in FileNames and the information in the
1074 DepCache to perform the installation of packages.*/
1075 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1076 pkgPackageManager :: OrderResult
1077 pkgPackageManager :: DoInstall ( APT :: Progress :: PackageManager
* progress
)
1079 if ( DoInstallPreFork () == Failed
)
1082 return DoInstallPostFork ( progress
);