]>
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 interesting 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/macros.h>
27 #include <apt-pkg/pkgcache.h>
28 #include <apt-pkg/cacheiterators.h>
29 #include <apt-pkg/strutl.h>
30 #include <apt-pkg/install-progress.h>
31 #include <apt-pkg/prettyprinters.h>
42 bool pkgPackageManager :: SigINTStop
= false ;
44 // PM::PackageManager - Constructor /*{{{*/
45 // ---------------------------------------------------------------------
47 pkgPackageManager :: pkgPackageManager ( pkgDepCache
* pCache
) : Cache (* pCache
),
48 List ( NULL
), Res ( Incomplete
), d ( NULL
)
50 FileNames
= new string
[ Cache
. Head (). PackageCount
];
51 Debug
= _config
-> FindB ( "Debug::pkgPackageManager" , false );
52 NoImmConfigure
= ! _config
-> FindB ( "APT::Immediate-Configure" , true );
53 ImmConfigureAll
= _config
-> FindB ( "APT::Immediate-Configure-All" , false );
56 // PM::PackageManager - Destructor /*{{{*/
57 // ---------------------------------------------------------------------
59 pkgPackageManager ::~ pkgPackageManager ()
65 // PM::GetArchives - Queue the archives for download /*{{{*/
66 // ---------------------------------------------------------------------
68 bool pkgPackageManager :: GetArchives ( pkgAcquire
* Owner
, pkgSourceList
* Sources
,
71 if ( CreateOrderList () == false )
75 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
76 List
-> OrderUnpack () : List
-> OrderCritical ();
77 if ( ordering
== false )
78 return _error
-> Error ( "Internal ordering error" );
80 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
82 PkgIterator
Pkg ( Cache
,* I
);
83 FileNames
[ Pkg
-> ID
] = string ();
85 // Skip packages to erase
86 if ( Cache
[ Pkg
]. Delete () == true )
89 // Skip Packages that need configure only.
90 if ( Pkg
. State () == pkgCache :: PkgIterator :: NeedsConfigure
&&
91 Cache
[ Pkg
]. Keep () == true )
94 // Skip already processed packages
95 if ( List
-> IsNow ( Pkg
) == false )
98 new pkgAcqArchive ( Owner
, Sources
, Recs
, Cache
[ Pkg
]. InstVerIter ( Cache
),
105 // PM::FixMissing - Keep all missing packages /*{{{*/
106 // ---------------------------------------------------------------------
107 /* This is called to correct the installation when packages could not
109 bool pkgPackageManager :: FixMissing ()
111 pkgDepCache :: ActionGroup
group ( Cache
);
112 pkgProblemResolver
Resolve (& Cache
);
113 List
-> SetFileList ( FileNames
);
116 for ( PkgIterator I
= Cache
. PkgBegin (); I
. end () == false ; ++ I
)
118 if ( List
-> IsMissing ( I
) == false )
121 // Okay, this file is missing and we need it. Mark it for keep
123 Cache
. MarkKeep ( I
, false , false );
126 // We have to empty the list otherwise it will not have the new changes
133 // Now downgrade everything that is broken
134 return Resolve
. ResolveByKeep () == true && Cache
. BrokenCount () == 0 ;
137 // PM::ImmediateAdd - Add the immediate flag recursivly /*{{{*/
138 // ---------------------------------------------------------------------
139 /* This adds the immediate flag to the pkg and recursively to the
142 void pkgPackageManager :: ImmediateAdd ( PkgIterator I
, bool UseInstallVer
, unsigned const int & Depth
)
148 if ( Cache
[ I
]. InstallVer
== 0 )
150 D
= Cache
[ I
]. InstVerIter ( Cache
). DependsList ();
152 if ( I
-> CurrentVer
== 0 )
154 D
= I
. CurrentVer (). DependsList ();
157 for ( /* nothing */ ; D
. end () == false ; ++ D
)
158 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
160 if (! List
-> IsFlag ( D
. TargetPkg (), pkgOrderList :: Immediate
))
163 clog
<< OutputInDepth ( Depth
) << "ImmediateAdd(): Adding Immediate flag to " << APT :: PrettyPkg (& Cache
, D
. TargetPkg ()) << " cause of " << D
. DepType () << " " << I
. FullName () << endl
;
164 List
-> Flag ( D
. TargetPkg (), pkgOrderList :: Immediate
);
165 ImmediateAdd ( D
. TargetPkg (), UseInstallVer
, Depth
+ 1 );
171 // PM::CreateOrderList - Create the ordering class /*{{{*/
172 // ---------------------------------------------------------------------
173 /* This populates the ordering list with all the packages that are
175 bool pkgPackageManager :: CreateOrderList ()
181 List
= new pkgOrderList (& Cache
);
183 if ( Debug
&& ImmConfigureAll
)
184 clog
<< "CreateOrderList(): Adding Immediate flag for all packages because of APT::Immediate-Configure-All" << endl
;
186 // Generate the list of affected packages and sort it
187 for ( PkgIterator I
= Cache
. PkgBegin (); I
. end () == false ; ++ I
)
189 // Ignore no-version packages
190 if ( I
-> VersionList
== 0 )
193 // Mark the package and its dependents for immediate configuration
194 if (((( I
-> Flags
& pkgCache :: Flag :: Essential
) == pkgCache :: Flag :: Essential
) &&
195 NoImmConfigure
== false ) || ImmConfigureAll
)
197 if ( Debug
&& ! ImmConfigureAll
)
198 clog
<< "CreateOrderList(): Adding Immediate flag for " << I
. FullName () << endl
;
199 List
-> Flag ( I
, pkgOrderList :: Immediate
);
201 if (! ImmConfigureAll
) {
202 // Look for other install packages to make immediate configurea
203 ImmediateAdd ( I
, true );
205 // And again with the current version.
206 ImmediateAdd ( I
, false );
211 if (( Cache
[ I
]. Keep () == true ||
212 Cache
[ I
]. InstVerIter ( Cache
) == I
. CurrentVer ()) &&
213 I
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
214 ( Cache
[ I
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
&&
215 ( I
. Purge () != false || Cache
[ I
]. Mode
!= pkgDepCache :: ModeDelete
||
216 ( Cache
[ I
]. iFlags
& pkgDepCache :: Purge
) != pkgDepCache :: Purge
))
219 // Append it to the list
226 // PM::DepAlwaysTrue - Returns true if this dep is irrelevant /*{{{*/
227 // ---------------------------------------------------------------------
228 /* The restriction on provides is to eliminate the case when provides
229 are transitioning between valid states [ie exim to smail] */
230 bool pkgPackageManager :: DepAlwaysTrue ( DepIterator D
)
232 if ( D
. TargetPkg ()-> ProvidesList
!= 0 )
235 if (( Cache
[ D
] & pkgDepCache :: DepInstall
) != 0 &&
236 ( Cache
[ D
] & pkgDepCache :: DepNow
) != 0 )
241 // PM::CheckRConflicts - Look for reverse conflicts /*{{{*/
242 // ---------------------------------------------------------------------
243 /* This looks over the reverses for a conflicts line that needs early
245 bool pkgPackageManager :: CheckRConflicts ( PkgIterator Pkg
, DepIterator D
,
248 for (; D
. end () == false ; ++ D
)
250 if ( D
-> Type
!= pkgCache :: Dep :: Conflicts
&&
251 D
-> Type
!= pkgCache :: Dep :: Obsoletes
)
254 // The package hasn't been changed
255 if ( List
-> IsNow ( Pkg
) == false )
258 // Ignore self conflicts, ignore conflicts from irrelevant versions
259 if ( D
. IsIgnorable ( Pkg
) || D
. ParentVer () != D
. ParentPkg (). CurrentVer ())
262 if ( Cache
. VS (). CheckDep ( Ver
, D
-> CompareOp
, D
. TargetVer ()) == false )
265 if ( EarlyRemove ( D
. ParentPkg (), & D
) == false )
266 return _error
-> Error ( "Reverse conflicts early remove for package ' %s ' failed" ,
267 Pkg
. FullName (). c_str ());
272 // PM::CheckRBreaks - Look for reverse breaks /*{{{*/
273 bool pkgPackageManager :: CheckRBreaks ( PkgIterator
const & Pkg
, DepIterator D
,
274 const char * const Ver
)
276 for (; D
. end () == false ; ++ D
)
278 if ( D
-> Type
!= pkgCache :: Dep :: DpkgBreaks
)
281 PkgIterator
const DP
= D
. ParentPkg ();
282 if ( Cache
[ DP
]. Delete () == false )
285 // Ignore self conflicts, ignore conflicts from irrelevant versions
286 if ( D
. IsIgnorable ( Pkg
) || D
. ParentVer () != DP
. CurrentVer ())
289 if ( Cache
. VS (). CheckDep ( Ver
, D
-> CompareOp
, D
. TargetVer ()) == false )
292 // no earlyremove() here as user has already agreed to the permanent removal
293 if ( SmartRemove ( DP
) == false )
294 return _error
-> Error ( "Internal Error, Could not early remove %s ( %d )" , DP
. FullName (). c_str (), 4 );
299 // PM::ConfigureAll - Run the all out configuration /*{{{*/
300 // ---------------------------------------------------------------------
301 /* This configures every package. It is assumed they are all unpacked and
302 that the final configuration is valid. This is also used to catch packages
303 that have not been configured when using ImmConfigureAll */
304 bool pkgPackageManager :: ConfigureAll ()
306 pkgOrderList
OList (& Cache
);
308 // Populate the order list
309 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
310 if ( List
-> IsFlag ( pkgCache :: PkgIterator ( Cache
,* I
),
311 pkgOrderList :: UnPacked
) == true )
314 if ( OList
. OrderConfigure () == false )
317 std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
318 bool const ConfigurePkgs
= ( conf
== "all" );
320 // Perform the configuring
321 for ( pkgOrderList :: iterator I
= OList
. begin (); I
!= OList
. end (); ++ I
)
323 PkgIterator
Pkg ( Cache
,* I
);
325 /* Check if the package has been configured, this can happen if SmartConfigure
327 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
)) continue ;
329 if ( ConfigurePkgs
== true && SmartConfigure ( Pkg
, 0 ) == false ) {
331 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
332 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 1 );
334 _error
-> Error ( "Internal error, packages left unconfigured. %s " , Pkg
. FullName (). c_str ());
338 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
344 // PM::NonLoopingSmart - helper to avoid loops while calling Smart methods /*{{{*/
345 // -----------------------------------------------------------------------
346 /* ensures that a loop of the form A depends B, B depends A (and similar)
347 is not leading us down into infinite recursion segfault land */
348 bool pkgPackageManager :: NonLoopingSmart ( SmartAction
const action
, pkgCache :: PkgIterator
& Pkg
,
349 pkgCache :: PkgIterator DepPkg
, int const Depth
, bool const PkgLoop
,
350 bool * const Bad
, bool * const Changed
)
352 if ( PkgLoop
== false )
353 List
-> Flag ( Pkg
, pkgOrderList :: Loop
);
354 bool success
= false ;
357 case UNPACK_IMMEDIATE
: success
= SmartUnPack ( DepPkg
, true , Depth
+ 1 ); break ;
358 case UNPACK
: success
= SmartUnPack ( DepPkg
, false , Depth
+ 1 ); break ;
359 case CONFIGURE
: success
= SmartConfigure ( DepPkg
, Depth
+ 1 ); break ;
361 if ( PkgLoop
== false )
362 List
-> RmFlag ( Pkg
, pkgOrderList :: Loop
);
364 if ( success
== false )
369 if ( Changed
!= NULL
&& List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) == false )
374 // PM::SmartConfigure - Perform immediate configuration of the pkg /*{{{*/
375 // ---------------------------------------------------------------------
376 /* This function tries to put the system in a state where Pkg can be configured.
377 This involves checking each of Pkg's dependencies and unpacking and
378 configuring packages where needed. */
379 bool pkgPackageManager :: SmartConfigure ( PkgIterator Pkg
, int const Depth
)
381 // If this is true, only check and correct and dependencies without the Loop flag
382 bool const PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
385 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
386 clog
<< OutputInDepth ( Depth
) << "SmartConfigure " << Pkg
. FullName () << " (" << InstallVer
. VerStr () << ")" ;
388 clog
<< " (Only Correct Dependencies)" ;
392 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
394 /* Because of the ordered list, most dependencies should be unpacked,
395 however if there is a loop (A depends on B, B depends on A) this will not
396 be the case, so check for dependencies before configuring. */
397 bool Bad
= false , Changed
= false ;
398 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
400 std :: list
< DepIterator
> needConfigure
;
403 // Check each dependency and see if anything needs to be done
404 // so that it can be configured
406 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
408 // Compute a single dependency element (glob or)
409 pkgCache :: DepIterator Start
, End
;
412 if ( End
-> Type
!= pkgCache :: Dep :: Depends
&& End
-> Type
!= pkgCache :: Dep :: PreDepends
)
416 // the first pass checks if we its all good, i.e. if we have
417 // to do anything at all
418 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
420 std :: unique_ptr
< Version
*[]> VList ( Cur
. AllTargets ());
422 for ( Version
** I
= VList
. get (); * I
!= 0 ; ++ I
)
424 VerIterator
Ver ( Cache
,* I
);
425 PkgIterator DepPkg
= Ver
. ParentPkg ();
427 // Check if the current version of the package is available and will satisfy this dependency
428 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
429 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
430 DepPkg
. State () == PkgIterator :: NeedsNothing
&&
431 ( Cache
[ DepPkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
437 // Check if the version that is going to be installed will satisfy the dependency
438 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
444 std :: clog
<< OutputInDepth ( Depth
) << "Package " << APT :: PrettyPkg (& Cache
, Pkg
) << " loops in SmartConfigure" ;
445 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
))
448 std :: clog
<< ", but it isn't unpacked yet" ;
450 std :: clog
<< std :: endl
;
454 if ( Cur
== End
|| Bad
== false )
458 // this dependency is in a good state, so we can stop
462 std :: clog
<< OutputInDepth ( Depth
) << "Found ok dep " << APT :: PrettyPkg (& Cache
, Start
. TargetPkg ()) << std :: endl
;
466 // Check for dependencies that have not been unpacked,
467 // probably due to loops.
468 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
470 std :: unique_ptr
< Version
*[]> VList ( Cur
. AllTargets ());
472 for ( Version
** I
= VList
. get (); * I
!= 0 ; ++ I
)
474 VerIterator
Ver ( Cache
,* I
);
475 PkgIterator DepPkg
= Ver
. ParentPkg ();
477 // Check if the current version of the package is available and will satisfy this dependency
478 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
479 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
480 DepPkg
. State () == PkgIterator :: NeedsNothing
&&
481 ( Cache
[ DepPkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
484 // Check if the version that is going to be installed will satisfy the dependency
485 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
491 std :: clog
<< OutputInDepth ( Depth
) << "Package " << APT :: PrettyPkg (& Cache
, Pkg
) << " loops in SmartConfigure" ;
492 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
))
495 std :: clog
<< ", but it isn't unpacked yet" ;
497 std :: clog
<< std :: endl
;
502 clog
<< OutputInDepth ( Depth
) << "Unpacking " << DepPkg
. FullName () << " to avoid loop " << APT :: PrettyDep (& Cache
, Cur
) << endl
;
503 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
506 // at this point we either unpacked a Dep or we are in a loop,
507 // no need to unpack a second one
511 if ( Cur
== End
|| Bad
== false )
518 needConfigure
. push_back ( Start
);
521 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (1) for %s , aborting" , Pkg
. FullName (). c_str ());
522 } while ( Changed
== true );
524 // now go over anything that needs configuring
525 Bad
= false , Changed
= false , i
= 0 ;
529 for ( std :: list
< DepIterator
>:: const_iterator D
= needConfigure
. begin (); D
!= needConfigure
. end (); ++ D
)
531 // Compute a single dependency element (glob or) without modifying D
532 pkgCache :: DepIterator Start
, End
;
534 pkgCache :: DepIterator Discard
= * D
;
535 Discard
. GlobOr ( Start
, End
);
538 if ( End
-> Type
!= pkgCache :: Dep :: Depends
&& End
-> Type
!= pkgCache :: Dep :: PreDepends
)
542 // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
543 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
545 std :: unique_ptr
< Version
*[]> VList ( Cur
. AllTargets ());
547 for ( Version
** I
= VList
. get (); * I
!= 0 ; ++ I
)
549 VerIterator
Ver ( Cache
,* I
);
550 PkgIterator DepPkg
= Ver
. ParentPkg ();
552 // Check if the version that is going to be installed will satisfy the dependency
553 if ( Cache
[ DepPkg
]. InstallVer
!= * I
)
556 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
))
558 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) && PkgLoop
)
560 // This dependency has already been dealt with by another SmartConfigure on Pkg
565 std :: clog
<< OutputInDepth ( Depth
) << "Configure already unpacked " << APT :: PrettyPkg (& Cache
, DepPkg
) << std :: endl
;
566 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
571 else if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
577 if ( Cur
== End
|| Bad
== false )
582 if ( Bad
== true && Changed
== false && Debug
== true )
583 std :: clog
<< OutputInDepth ( Depth
) << "Could not satisfy " << APT :: PrettyDep (& Cache
, * D
) << std :: endl
;
586 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (2) for %s , aborting" , Pkg
. FullName (). c_str ());
587 } while ( Changed
== true );
590 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
592 // Check for reverse conflicts.
593 if ( CheckRBreaks ( Pkg
, Pkg
. RevDependsList (), instVer
. VerStr ()) == false )
596 for ( PrvIterator P
= instVer
. ProvidesList (); P
. end () == false ; ++ P
)
597 if ( Pkg
-> Group
!= P
. OwnerPkg ()-> Group
)
598 CheckRBreaks ( Pkg
, P
. ParentPkg (). RevDependsList (), P
. ProvideVersion ());
600 if ( PkgLoop
) return true ;
602 static std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
603 static bool const ConfigurePkgs
= ( conf
== "all" || conf
== "smart" );
605 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
))
606 return _error
-> Error ( "Internal configure error on ' %s '." , Pkg
. FullName (). c_str ());
608 if ( ConfigurePkgs
== true && Configure ( Pkg
) == false )
611 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
613 if (( Cache
[ Pkg
]. InstVerIter ( Cache
)-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
614 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
615 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
617 if ( Pkg
== P
|| List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
618 List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == false ||
619 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
620 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
622 if ( SmartConfigure ( P
, ( Depth
+ 1 )) == false )
627 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
) == false )
628 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
633 // PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
634 // ---------------------------------------------------------------------
635 /* This is called to deal with conflicts arising from unpacking */
636 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
)
638 return EarlyRemove ( Pkg
, NULL
);
640 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
, DepIterator
const * const Dep
)
642 if ( List
-> IsNow ( Pkg
) == false )
645 // Already removed it
646 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
649 // Woops, it will not be re-installed!
650 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: InList
) == false )
653 // these breaks on M-A:same packages can be dealt with. They 'loop' by design
654 if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
&& Dep
-> IsMultiArchImplicit () == true )
657 // Essential packages get special treatment
658 bool IsEssential
= false ;
659 if (( Pkg
-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
660 ( Pkg
-> Flags
& pkgCache :: Flag :: Important
) != 0 )
663 /* Check for packages that are the dependents of essential packages and
665 if ( Pkg
-> CurrentVer
!= 0 )
667 for ( pkgCache :: DepIterator D
= Pkg
. RevDependsList (); D
. end () == false &&
668 IsEssential
== false ; ++ D
)
669 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
670 if (( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
671 ( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Important
) != 0 )
675 if ( IsEssential
== true )
677 if ( _config
-> FindB ( "APT::Force-LoopBreak" , false ) == false )
678 return _error
-> Error ( _ ( "This installation run will require temporarily "
679 "removing the essential package %s due to a "
680 "Conflicts/Pre-Depends loop. This is often bad, "
681 "but if you really want to do it, activate the "
682 "APT::Force-LoopBreak option." ), Pkg
. FullName (). c_str ());
684 // dpkg will auto-deconfigure it, no need for the big remove hammer
685 else if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
)
688 bool Res
= SmartRemove ( Pkg
);
689 if ( Cache
[ Pkg
]. Delete () == false )
690 List
-> Flag ( Pkg
, pkgOrderList :: Removed
, pkgOrderList :: States
);
695 // PM::SmartRemove - Removal Helper /*{{{*/
696 // ---------------------------------------------------------------------
698 bool pkgPackageManager :: SmartRemove ( PkgIterator Pkg
)
700 if ( List
-> IsNow ( Pkg
) == false )
703 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
705 return Remove ( Pkg
,( Cache
[ Pkg
]. iFlags
& pkgDepCache :: Purge
) == pkgDepCache :: Purge
);
708 // PM::SmartUnPack - Install helper /*{{{*/
709 // ---------------------------------------------------------------------
710 /* This puts the system in a state where it can Unpack Pkg, if Pkg is already
711 unpacked, or when it has been unpacked, if Immediate==true it configures it. */
712 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
)
714 return SmartUnPack ( Pkg
, true , 0 );
716 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
, bool const Immediate
, int const Depth
)
718 bool PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
721 clog
<< OutputInDepth ( Depth
) << "SmartUnPack " << Pkg
. FullName ();
722 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
723 if ( Pkg
. CurrentVer () == 0 )
724 clog
<< " (install version " << InstallVer
. VerStr () << ")" ;
726 clog
<< " (replace version " << Pkg
. CurrentVer (). VerStr () << " with " << InstallVer
. VerStr () << ")" ;
728 clog
<< " (Only Perform PreUnpack Checks)" ;
730 clog
<< " immediately" ;
734 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
736 /* PreUnpack Checks: This loop checks and attempts to rectify any problems that would prevent the package being unpacked.
737 It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
738 avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
739 complex dependency structures, trying to configure some packages while breaking the loops can complicate things.
740 This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
741 or by the ConfigureAll call at the end of the for loop in OrderInstall. */
742 bool SomethingBad
= false , Changed
= false ;
743 bool couldBeTemporaryRemoved
= Depth
!= 0 && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == false ;
744 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
749 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
751 // Compute a single dependency element (glob or)
752 pkgCache :: DepIterator Start
, End
;
755 if ( End
-> Type
== pkgCache :: Dep :: PreDepends
)
759 clog
<< OutputInDepth ( Depth
) << "PreDepends order for " << Pkg
. FullName () << std :: endl
;
761 // Look for easy targets: packages that are already okay
762 for ( DepIterator Cur
= Start
; Bad
== true ; ++ Cur
)
764 std :: unique_ptr
< Version
*[]> VList ( Cur
. AllTargets ());
765 for ( Version
** I
= VList
. get (); * I
!= 0 ; ++ I
)
767 VerIterator
Ver ( Cache
,* I
);
768 PkgIterator Pkg
= Ver
. ParentPkg ();
770 // See if the current version is ok
771 if ( Pkg
. CurrentVer () == Ver
&& List
-> IsNow ( Pkg
) == true &&
772 Pkg
. State () == PkgIterator :: NeedsNothing
&&
773 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
777 clog
<< OutputInDepth ( Depth
) << "Found ok package " << Pkg
. FullName () << endl
;
785 // Look for something that could be configured.
786 for ( DepIterator Cur
= Start
; Bad
== true && Cur
. end () == false ; ++ Cur
)
788 std :: unique_ptr
< Version
*[]> VList ( Cur
. AllTargets ());
789 for ( Version
** I
= VList
. get (); * I
!= 0 ; ++ I
)
791 VerIterator
Ver ( Cache
,* I
);
792 PkgIterator DepPkg
= Ver
. ParentPkg ();
794 // Not the install version
795 if ( Cache
[ DepPkg
]. InstallVer
!= * I
)
798 if ( Cache
[ DepPkg
]. Keep () == true && DepPkg
. State () == PkgIterator :: NeedsNothing
&&
799 ( Cache
[ DepPkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
802 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
808 // check if it needs unpack or if if configure is enough
809 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
) == false )
811 // two packages pre-depending on each other can't be handled sanely
812 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) && PkgLoop
)
814 // this isn't an error as there is potential for something else to satisfy it
815 // (like a provides or an or-group member)
817 clog
<< OutputInDepth ( Depth
) << "Unpack loop detected between " << DepPkg
. FullName () << " and " << Pkg
. FullName () << endl
;
822 clog
<< OutputInDepth ( Depth
) << "Trying to SmartUnpack " << DepPkg
. FullName () << endl
;
823 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
829 clog
<< OutputInDepth ( Depth
) << "Trying to SmartConfigure " << DepPkg
. FullName () << endl
;
830 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
840 else if ( End
-> Type
== pkgCache :: Dep :: Conflicts
||
841 End
-> Type
== pkgCache :: Dep :: Obsoletes
||
842 End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
844 std :: unique_ptr
< Version
*[]> VList ( End
. AllTargets ());
845 for ( Version
** I
= VList
. get (); * I
!= 0 ; ++ I
)
847 VerIterator
Ver ( Cache
,* I
);
848 PkgIterator ConflictPkg
= Ver
. ParentPkg ();
849 if ( ConflictPkg
. CurrentVer () != Ver
)
852 std :: clog
<< OutputInDepth ( Depth
) << "Ignore not-installed version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << APT :: PrettyDep (& Cache
, End
) << std :: endl
;
856 if ( List
-> IsNow ( ConflictPkg
) == false )
859 std :: clog
<< OutputInDepth ( Depth
) << "Ignore already dealt-with version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << APT :: PrettyDep (& Cache
, End
) << std :: endl
;
863 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
866 clog
<< OutputInDepth ( Depth
) << "Ignoring " << APT :: PrettyDep (& Cache
, End
) << " as " << ConflictPkg
. FullName () << "was temporarily removed" << endl
;
870 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Loop
) && PkgLoop
)
872 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
&& End
. IsMultiArchImplicit () == true )
875 clog
<< OutputInDepth ( Depth
) << "Because dependency is MultiArchImplicit we ignored looping on: " << APT :: PrettyPkg (& Cache
, ConflictPkg
) << endl
;
880 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
881 clog
<< OutputInDepth ( Depth
) << "Because of breaks knot, deconfigure " << ConflictPkg
. FullName () << " temporarily" << endl
;
883 clog
<< OutputInDepth ( Depth
) << "Because of conflict knot, removing " << ConflictPkg
. FullName () << " temporarily" << endl
;
885 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
886 return _error
-> Error ( "Internal Error, Could not early remove %s ( %d )" , ConflictPkg
. FullName (). c_str (), 3 );
891 if ( Cache
[ ConflictPkg
]. Delete () == false )
895 clog
<< OutputInDepth ( Depth
) << "Unpacking " << ConflictPkg
. FullName () << " to avoid " << APT :: PrettyDep (& Cache
, End
);
897 clog
<< " (Looping)" ;
900 // we would like to avoid temporary removals and all that at best via a simple unpack
901 _error
-> PushToStack ();
902 if ( NonLoopingSmart ( UNPACK
, Pkg
, ConflictPkg
, Depth
, PkgLoop
, NULL
, & Changed
) == false )
904 // but if it fails ignore this failure and look for alternative ways of solving
907 clog
<< OutputInDepth ( Depth
) << "Avoidance unpack of " << ConflictPkg
. FullName () << " failed for " << APT :: PrettyDep (& Cache
, End
) << " ignoring:" << std :: endl
;
908 _error
-> DumpErrors ( std :: clog
, GlobalError :: DEBUG
, false );
910 _error
-> RevertToStack ();
911 // ignorance can only happen if a) one of the offenders is already gone
912 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
915 clog
<< OutputInDepth ( Depth
) << "But " << ConflictPkg
. FullName () << " was temporarily removed in the meantime to satisfy " << APT :: PrettyDep (& Cache
, End
) << endl
;
917 else if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
920 clog
<< OutputInDepth ( Depth
) << "But " << Pkg
. FullName () << " was temporarily removed in the meantime to satisfy " << APT :: PrettyDep (& Cache
, End
) << endl
;
922 // or b) we can make one go (removal or dpkg auto-deconfigure)
926 clog
<< OutputInDepth ( Depth
) << "So temprorary remove/deconfigure " << ConflictPkg
. FullName () << " to satisfy " << APT :: PrettyDep (& Cache
, End
) << endl
;
927 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
928 return _error
-> Error ( "Internal Error, Could not early remove %s ( %d )" , ConflictPkg
. FullName (). c_str (), 2 );
932 _error
-> MergeWithStack ();
937 clog
<< OutputInDepth ( Depth
) << "Removing " << ConflictPkg
. FullName () << " now to avoid " << APT :: PrettyDep (& Cache
, End
) << endl
;
938 // no earlyremove() here as user has already agreed to the permanent removal
939 if ( SmartRemove ( Pkg
) == false )
940 return _error
-> Error ( "Internal Error, Could not early remove %s ( %d )" , ConflictPkg
. FullName (). c_str (), 1 );
946 return _error
-> Error ( "Internal error: APT::pkgPackageManager::MaxLoopCount reached in SmartConfigure for %s , aborting" , Pkg
. FullName (). c_str ());
947 } while ( Changed
== true );
949 if ( SomethingBad
== true )
950 return _error
-> Error ( "Couldn't configure %s , probably a dependency cycle." , Pkg
. FullName (). c_str ());
952 if ( couldBeTemporaryRemoved
== true && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
955 std :: clog
<< OutputInDepth ( Depth
) << "Prevent unpack as " << APT :: PrettyPkg (& Cache
, Pkg
) << " is currently temporarily removed" << std :: endl
;
959 // Check for reverse conflicts.
960 if ( CheckRConflicts ( Pkg
, Pkg
. RevDependsList (),
961 instVer
. VerStr ()) == false )
964 for ( PrvIterator P
= instVer
. ProvidesList ();
965 P
. end () == false ; ++ P
)
966 if ( Pkg
-> Group
!= P
. OwnerPkg ()-> Group
)
967 CheckRConflicts ( Pkg
, P
. ParentPkg (). RevDependsList (), P
. ProvideVersion ());
972 List
-> Flag ( Pkg
, pkgOrderList :: UnPacked
, pkgOrderList :: States
);
974 if ( Immediate
== true && ( instVer
-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
976 /* Do lockstep M-A:same unpacking in two phases:
977 First unpack all installed architectures, then the not installed.
978 This way we avoid that M-A: enabled packages are installed before
979 their older non-M-A enabled packages are replaced by newer versions */
980 bool const installed
= Pkg
-> CurrentVer
!= 0 ;
981 if ( installed
== true &&
982 ( instVer
!= Pkg
. CurrentVer () ||
983 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
984 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
986 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
987 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
989 if ( P
-> CurrentVer
== 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
990 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
991 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
993 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
996 if ( installed
== false && Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
998 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
999 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
1001 if ( P
-> CurrentVer
!= 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
1002 List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
1003 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
1004 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
1006 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
1010 // packages which are already unpacked don't need to be unpacked again
1011 else if (( instVer
!= Pkg
. CurrentVer () ||
1012 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
1013 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
1016 if ( Immediate
== true ) {
1017 // Perform immedate configuration of the package.
1018 if ( SmartConfigure ( Pkg
, Depth
+ 1 ) == false )
1019 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
1020 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 2 );
1026 // PM::OrderInstall - Installation ordering routine /*{{{*/
1027 // ---------------------------------------------------------------------
1029 pkgPackageManager :: OrderResult
pkgPackageManager :: OrderInstall ()
1031 if ( CreateOrderList () == false )
1037 clog
<< "Beginning to order" << endl
;
1039 bool const ordering
=
1040 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
1041 List
-> OrderUnpack ( FileNames
) : List
-> OrderCritical ();
1042 if ( ordering
== false )
1044 _error
-> Error ( "Internal ordering error" );
1049 clog
<< "Done ordering" << endl
;
1051 bool DoneSomething
= false ;
1052 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
1054 PkgIterator
Pkg ( Cache
,* I
);
1056 if ( List
-> IsNow ( Pkg
) == false )
1059 clog
<< "Skipping already done " << Pkg
. FullName () << endl
;
1063 if ( List
-> IsMissing ( Pkg
) == true )
1066 clog
<< "Sequence completed at " << Pkg
. FullName () << endl
;
1067 if ( DoneSomething
== false )
1069 _error
-> Error ( "Internal Error, ordering was unable to handle the media swap" );
1076 if ( Cache
[ Pkg
]. Keep () == true &&
1077 Pkg
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
1078 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
1080 _error
-> Error ( "Internal Error, trying to manipulate a kept package ( %s )" , Pkg
. FullName (). c_str ());
1084 // Perform a delete or an install
1085 if ( Cache
[ Pkg
]. Delete () == true )
1087 if ( SmartRemove ( Pkg
) == false )
1091 if ( SmartUnPack ( Pkg
, List
-> IsFlag ( Pkg
, pkgOrderList :: Immediate
), 0 ) == false )
1093 DoneSomething
= true ;
1095 if ( ImmConfigureAll
) {
1096 /* ConfigureAll here to pick up and packages left unconfigured because they were unpacked in the
1097 "PreUnpack Checks" section */
1098 if (! ConfigureAll ())
1103 // Final run through the configure phase
1104 if ( ConfigureAll () == false )
1108 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
1110 if ( List
-> IsFlag (* I
, pkgOrderList :: Configured
) == false )
1112 _error
-> Error ( "Internal error, packages left unconfigured. %s " ,
1113 PkgIterator ( Cache
,* I
). FullName (). c_str ());
1120 // PM::DoInstallPostFork - compat /*{{{*/
1121 // ---------------------------------------------------------------------
1123 pkgPackageManager :: OrderResult
1124 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1126 APT :: Progress :: PackageManager
* progress
= new
1127 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1128 pkgPackageManager :: OrderResult res
= DoInstallPostFork ( progress
);
1133 // PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
1134 // ---------------------------------------------------------------------
1135 pkgPackageManager :: OrderResult
1136 pkgPackageManager :: DoInstallPostFork ( APT :: Progress :: PackageManager
* progress
)
1138 bool goResult
= Go ( progress
);
1139 if ( goResult
== false )
1145 // PM::DoInstall - Does the installation /*{{{*/
1146 // ---------------------------------------------------------------------
1148 pkgPackageManager :: OrderResult
1149 pkgPackageManager :: DoInstall ( int statusFd
)
1151 APT :: Progress :: PackageManager
* progress
= new
1152 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1153 OrderResult res
= DoInstall ( progress
);
1158 // PM::DoInstall - Does the installation /*{{{*/
1159 // ---------------------------------------------------------------------
1160 /* This uses the filenames in FileNames and the information in the
1161 DepCache to perform the installation of packages.*/
1162 pkgPackageManager :: OrderResult
1163 pkgPackageManager :: DoInstall ( APT :: Progress :: PackageManager
* progress
)
1165 if ( DoInstallPreFork () == Failed
)
1168 return DoInstallPostFork ( progress
);