]>
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>
31 #include <apt-pkg/install-progress.h>
42 bool pkgPackageManager :: SigINTStop
= false ;
44 // PM::PackageManager - Constructor /*{{{*/
45 // ---------------------------------------------------------------------
47 pkgPackageManager :: pkgPackageManager ( pkgDepCache
* pCache
) : Cache (* pCache
),
48 List ( NULL
), Res ( Incomplete
)
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 " << 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 dependends 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::ConfigureAll - Run the all out configuration /*{{{*/
273 // ---------------------------------------------------------------------
274 /* This configures every package. It is assumed they are all unpacked and
275 that the final configuration is valid. This is also used to catch packages
276 that have not been configured when using ImmConfigureAll */
277 bool pkgPackageManager :: ConfigureAll ()
279 pkgOrderList
OList (& Cache
);
281 // Populate the order list
282 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
283 if ( List
-> IsFlag ( pkgCache :: PkgIterator ( Cache
,* I
),
284 pkgOrderList :: UnPacked
) == true )
287 if ( OList
. OrderConfigure () == false )
290 std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
291 bool const ConfigurePkgs
= ( conf
== "all" );
293 // Perform the configuring
294 for ( pkgOrderList :: iterator I
= OList
. begin (); I
!= OList
. end (); ++ I
)
296 PkgIterator
Pkg ( Cache
,* I
);
298 /* Check if the package has been configured, this can happen if SmartConfigure
300 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
)) continue ;
302 if ( ConfigurePkgs
== true && SmartConfigure ( Pkg
, 0 ) == false ) {
304 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
305 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 1 );
307 _error
-> Error ( "Internal error, packages left unconfigured. %s " , Pkg
. FullName (). c_str ());
311 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
317 // PM::NonLoopingSmart - helper to avoid loops while calling Smart methods /*{{{*/
318 // -----------------------------------------------------------------------
319 /* ensures that a loop of the form A depends B, B depends A (and similar)
320 is not leading us down into infinite recursion segfault land */
321 bool pkgPackageManager :: NonLoopingSmart ( SmartAction
const action
, pkgCache :: PkgIterator
& Pkg
,
322 pkgCache :: PkgIterator DepPkg
, int const Depth
, bool const PkgLoop
,
323 bool * const Bad
, bool * const Changed
)
325 if ( PkgLoop
== false )
326 List
-> Flag ( Pkg
, pkgOrderList :: Loop
);
327 bool success
= false ;
330 case UNPACK_IMMEDIATE
: success
= SmartUnPack ( DepPkg
, true , Depth
+ 1 ); break ;
331 case UNPACK
: success
= SmartUnPack ( DepPkg
, false , Depth
+ 1 ); break ;
332 case CONFIGURE
: success
= SmartConfigure ( DepPkg
, Depth
+ 1 ); break ;
334 if ( PkgLoop
== false )
335 List
-> RmFlag ( Pkg
, pkgOrderList :: Loop
);
337 if ( success
== false )
342 if ( Changed
!= NULL
&& List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) == false )
347 // PM::SmartConfigure - Perform immediate configuration of the pkg /*{{{*/
348 // ---------------------------------------------------------------------
349 /* This function tries to put the system in a state where Pkg can be configured.
350 This involves checking each of Pkg's dependencies and unpacking and
351 configuring packages where needed. */
352 bool pkgPackageManager :: SmartConfigure ( PkgIterator Pkg
, int const Depth
)
354 // If this is true, only check and correct and dependencies without the Loop flag
355 bool const PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
358 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
359 clog
<< OutputInDepth ( Depth
) << "SmartConfigure " << Pkg
. FullName () << " (" << InstallVer
. VerStr () << ")" ;
361 clog
<< " (Only Correct Dependencies)" ;
365 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
367 /* Because of the ordered list, most dependencies should be unpacked,
368 however if there is a loop (A depends on B, B depends on A) this will not
369 be the case, so check for dependencies before configuring. */
370 bool Bad
= false , Changed
= false ;
371 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
373 std :: list
< DepIterator
> needConfigure
;
377 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
379 // Compute a single dependency element (glob or)
380 pkgCache :: DepIterator Start
, End
;
383 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
387 // Check for dependencies that have not been unpacked, probably due to loops.
388 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
390 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
392 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
394 VerIterator
Ver ( Cache
,* I
);
395 PkgIterator DepPkg
= Ver
. ParentPkg ();
397 // Check if the current version of the package is available and will satisfy this dependency
398 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
399 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
400 DepPkg
. State () == PkgIterator :: NeedsNothing
)
406 // Check if the version that is going to be installed will satisfy the dependency
407 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
413 std :: clog
<< OutputInDepth ( Depth
) << "Package " << Pkg
<< " loops in SmartConfigure" << std :: endl
;
419 clog
<< OutputInDepth ( Depth
) << "Unpacking " << DepPkg
. FullName () << " to avoid loop " << Cur
<< endl
;
420 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
426 if ( Cur
== End
|| Bad
== false )
433 needConfigure
. push_back ( Start
);
436 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (1) for %s , aborting" , Pkg
. FullName (). c_str ());
437 } while ( Changed
== true );
439 Bad
= false , Changed
= false , i
= 0 ;
443 for ( std :: list
< DepIterator
>:: const_iterator D
= needConfigure
. begin (); D
!= needConfigure
. end (); ++ D
)
445 // Compute a single dependency element (glob or) without modifying D
446 pkgCache :: DepIterator Start
, End
;
448 pkgCache :: DepIterator Discard
= * D
;
449 Discard
. GlobOr ( Start
, End
);
452 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
456 // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
457 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
459 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
461 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
463 VerIterator
Ver ( Cache
,* I
);
464 PkgIterator DepPkg
= Ver
. ParentPkg ();
466 // Check if the version that is going to be installed will satisfy the dependency
467 if ( Cache
[ DepPkg
]. InstallVer
!= * I
)
470 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
))
472 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) && PkgLoop
)
474 // This dependency has already been dealt with by another SmartConfigure on Pkg
479 std :: clog
<< OutputInDepth ( Depth
) << "Configure already unpacked " << DepPkg
<< std :: endl
;
480 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
485 else if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
491 if ( Cur
== End
|| Bad
== false )
496 if ( Bad
== true && Changed
== false && Debug
== true )
497 std :: clog
<< OutputInDepth ( Depth
) << "Could not satisfy " << * D
<< std :: endl
;
500 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (2) for %s , aborting" , Pkg
. FullName (). c_str ());
501 } while ( Changed
== true );
504 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
506 if ( PkgLoop
) return true ;
508 static std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
509 static bool const ConfigurePkgs
= ( conf
== "all" || conf
== "smart" );
511 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
))
512 return _error
-> Error ( "Internal configure error on ' %s '." , Pkg
. FullName (). c_str ());
514 if ( ConfigurePkgs
== true && Configure ( Pkg
) == false )
517 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
519 if (( Cache
[ Pkg
]. InstVerIter ( Cache
)-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
520 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
521 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
523 if ( Pkg
== P
|| List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
524 List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == false ||
525 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
526 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
528 if ( SmartConfigure ( P
, ( Depth
+ 1 )) == false )
533 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
) == false )
534 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
539 // PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
540 // ---------------------------------------------------------------------
541 /* This is called to deal with conflicts arising from unpacking */
542 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
)
544 return EarlyRemove ( Pkg
, NULL
);
546 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
, DepIterator
const * const Dep
)
548 if ( List
-> IsNow ( Pkg
) == false )
551 // Already removed it
552 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
555 // Woops, it will not be re-installed!
556 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: InList
) == false )
559 // these breaks on M-A:same packages can be dealt with. They 'loop' by design
560 if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
&& Dep
-> IsMultiArchImplicit () == true )
563 // Essential packages get special treatment
564 bool IsEssential
= false ;
565 if (( Pkg
-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
566 ( Pkg
-> Flags
& pkgCache :: Flag :: Important
) != 0 )
569 /* Check for packages that are the dependents of essential packages and
571 if ( Pkg
-> CurrentVer
!= 0 )
573 for ( pkgCache :: DepIterator D
= Pkg
. RevDependsList (); D
. end () == false &&
574 IsEssential
== false ; ++ D
)
575 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
576 if (( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
577 ( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Important
) != 0 )
581 if ( IsEssential
== true )
583 if ( _config
-> FindB ( "APT::Force-LoopBreak" , false ) == false )
584 return _error
-> Error ( _ ( "This installation run will require temporarily "
585 "removing the essential package %s due to a "
586 "Conflicts/Pre-Depends loop. This is often bad, "
587 "but if you really want to do it, activate the "
588 "APT::Force-LoopBreak option." ), Pkg
. FullName (). c_str ());
590 // dpkg will auto-deconfigure it, no need for the big remove hammer
591 else if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
)
594 bool Res
= SmartRemove ( Pkg
);
595 if ( Cache
[ Pkg
]. Delete () == false )
596 List
-> Flag ( Pkg
, pkgOrderList :: Removed
, pkgOrderList :: States
);
601 // PM::SmartRemove - Removal Helper /*{{{*/
602 // ---------------------------------------------------------------------
604 bool pkgPackageManager :: SmartRemove ( PkgIterator Pkg
)
606 if ( List
-> IsNow ( Pkg
) == false )
609 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
611 return Remove ( Pkg
,( Cache
[ Pkg
]. iFlags
& pkgDepCache :: Purge
) == pkgDepCache :: Purge
);
614 // PM::SmartUnPack - Install helper /*{{{*/
615 // ---------------------------------------------------------------------
616 /* This puts the system in a state where it can Unpack Pkg, if Pkg is already
617 unpacked, or when it has been unpacked, if Immediate==true it configures it. */
618 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
)
620 return SmartUnPack ( Pkg
, true , 0 );
622 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
, bool const Immediate
, int const Depth
)
624 bool PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
627 clog
<< OutputInDepth ( Depth
) << "SmartUnPack " << Pkg
. FullName ();
628 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
629 if ( Pkg
. CurrentVer () == 0 )
630 clog
<< " (install version " << InstallVer
. VerStr () << ")" ;
632 clog
<< " (replace version " << Pkg
. CurrentVer (). VerStr () << " with " << InstallVer
. VerStr () << ")" ;
634 clog
<< " (Only Perform PreUnpack Checks)" ;
636 clog
<< " immediately" ;
640 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
642 /* PreUnpack Checks: This loop checks and attempts to rectify any problems that would prevent the package being unpacked.
643 It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
644 avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
645 complex dependency structures, trying to configure some packages while breaking the loops can complicate things.
646 This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
647 or by the ConfigureAll call at the end of the for loop in OrderInstall. */
648 bool SomethingBad
= false , Changed
= false ;
649 bool couldBeTemporaryRemoved
= Depth
!= 0 && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == false ;
650 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
655 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
657 // Compute a single dependency element (glob or)
658 pkgCache :: DepIterator Start
, End
;
661 if ( End
-> Type
== pkgCache :: Dep :: PreDepends
)
665 clog
<< OutputInDepth ( Depth
) << "PreDepends order for " << Pkg
. FullName () << std :: endl
;
667 // Look for easy targets: packages that are already okay
668 for ( DepIterator Cur
= Start
; Bad
== true ; ++ Cur
)
670 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
671 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
673 VerIterator
Ver ( Cache
,* I
);
674 PkgIterator Pkg
= Ver
. ParentPkg ();
676 // See if the current version is ok
677 if ( Pkg
. CurrentVer () == Ver
&& List
-> IsNow ( Pkg
) == true &&
678 Pkg
. State () == PkgIterator :: NeedsNothing
)
682 clog
<< OutputInDepth ( Depth
) << "Found ok package " << Pkg
. FullName () << endl
;
690 // Look for something that could be configured.
691 for ( DepIterator Cur
= Start
; Bad
== true && Cur
. end () == false ; ++ Cur
)
693 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
694 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
696 VerIterator
Ver ( Cache
,* I
);
697 PkgIterator DepPkg
= Ver
. ParentPkg ();
699 // Not the install version
700 if ( Cache
[ DepPkg
]. InstallVer
!= * I
||
701 ( Cache
[ DepPkg
]. Keep () == true && DepPkg
. State () == PkgIterator :: NeedsNothing
))
704 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
710 // check if it needs unpack or if if configure is enough
711 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
) == false )
714 clog
<< OutputInDepth ( Depth
) << "Trying to SmartUnpack " << DepPkg
. FullName () << endl
;
715 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
721 clog
<< OutputInDepth ( Depth
) << "Trying to SmartConfigure " << DepPkg
. FullName () << endl
;
722 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
732 else if ( End
-> Type
== pkgCache :: Dep :: Conflicts
||
733 End
-> Type
== pkgCache :: Dep :: Obsoletes
||
734 End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
736 SPtrArray
< Version
*> VList
= End
. AllTargets ();
737 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
739 VerIterator
Ver ( Cache
,* I
);
740 PkgIterator ConflictPkg
= Ver
. ParentPkg ();
741 if ( ConflictPkg
. CurrentVer () != Ver
)
744 std :: clog
<< OutputInDepth ( Depth
) << "Ignore not-installed version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
748 if ( List
-> IsNow ( ConflictPkg
) == false )
751 std :: clog
<< OutputInDepth ( Depth
) << "Ignore already dealt-with version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
755 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
758 clog
<< OutputInDepth ( Depth
) << "Ignoring " << End
<< " as " << ConflictPkg
. FullName () << "was temporarily removed" << endl
;
762 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Loop
) && PkgLoop
)
764 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
&& End
. IsMultiArchImplicit () == true )
767 clog
<< OutputInDepth ( Depth
) << "Because dependency is MultiArchImplicit we ignored looping on: " << ConflictPkg
<< endl
;
772 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
773 clog
<< OutputInDepth ( Depth
) << "Because of breaks knot, deconfigure " << ConflictPkg
. FullName () << " temporarily" << endl
;
775 clog
<< OutputInDepth ( Depth
) << "Because of conflict knot, removing " << ConflictPkg
. FullName () << " temporarily" << endl
;
777 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
778 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
783 if ( Cache
[ ConflictPkg
]. Delete () == false )
787 clog
<< OutputInDepth ( Depth
) << "Unpacking " << ConflictPkg
. FullName () << " to avoid " << End
;
789 clog
<< " (Looping)" ;
792 // we would like to avoid temporary removals and all that at best via a simple unpack
793 _error
-> PushToStack ();
794 if ( NonLoopingSmart ( UNPACK
, Pkg
, ConflictPkg
, Depth
, PkgLoop
, NULL
, & Changed
) == false )
796 // but if it fails ignore this failure and look for alternative ways of solving
799 clog
<< OutputInDepth ( Depth
) << "Avoidance unpack of " << ConflictPkg
. FullName () << " failed for " << End
<< std :: endl
;
800 _error
-> DumpErrors ( std :: clog
);
802 _error
-> RevertToStack ();
803 // ignorance can only happen if a) one of the offenders is already gone
804 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
807 clog
<< OutputInDepth ( Depth
) << "But " << ConflictPkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
809 else if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
812 clog
<< OutputInDepth ( Depth
) << "But " << Pkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
814 // or b) we can make one go (removal or dpkg auto-deconfigure)
818 clog
<< OutputInDepth ( Depth
) << "So temprorary remove/deconfigure " << ConflictPkg
. FullName () << " to satisfy " << End
<< endl
;
819 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
820 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
824 _error
-> MergeWithStack ();
829 clog
<< OutputInDepth ( Depth
) << "Removing " << ConflictPkg
. FullName () << " now to avoid " << End
<< endl
;
830 // no earlyremove() here as user has already agreed to the permanent removal
831 if ( SmartRemove ( Pkg
) == false )
832 return _error
-> Error ( "Internal Error, Could not early remove %s (1)" , ConflictPkg
. FullName (). c_str ());
838 return _error
-> Error ( "Internal error: APT::pkgPackageManager::MaxLoopCount reached in SmartConfigure for %s , aborting" , Pkg
. FullName (). c_str ());
839 } while ( Changed
== true );
841 if ( SomethingBad
== true )
842 return _error
-> Error ( "Couldn't configure %s , probably a dependency cycle." , Pkg
. FullName (). c_str ());
844 if ( couldBeTemporaryRemoved
== true && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
847 std :: clog
<< OutputInDepth ( Depth
) << "Prevent unpack as " << Pkg
<< " is currently temporarily removed" << std :: endl
;
851 // Check for reverse conflicts.
852 if ( CheckRConflicts ( Pkg
, Pkg
. RevDependsList (),
853 instVer
. VerStr ()) == false )
856 for ( PrvIterator P
= instVer
. ProvidesList ();
857 P
. end () == false ; ++ P
)
858 if ( Pkg
-> Group
!= P
. OwnerPkg ()-> Group
)
859 CheckRConflicts ( Pkg
, P
. ParentPkg (). RevDependsList (), P
. ProvideVersion ());
864 List
-> Flag ( Pkg
, pkgOrderList :: UnPacked
, pkgOrderList :: States
);
866 if ( Immediate
== true && ( instVer
-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
868 /* Do lockstep M-A:same unpacking in two phases:
869 First unpack all installed architectures, then the not installed.
870 This way we avoid that M-A: enabled packages are installed before
871 their older non-M-A enabled packages are replaced by newer versions */
872 bool const installed
= Pkg
-> CurrentVer
!= 0 ;
873 if ( installed
== true &&
874 ( instVer
!= Pkg
. CurrentVer () ||
875 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
876 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
878 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
879 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
881 if ( P
-> CurrentVer
== 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
882 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
883 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
885 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
888 if ( installed
== false && Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
890 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
891 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
893 if ( P
-> CurrentVer
!= 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
894 List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
895 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
896 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
898 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
902 // packages which are already unpacked don't need to be unpacked again
903 else if (( instVer
!= Pkg
. CurrentVer () ||
904 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
905 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
908 if ( Immediate
== true ) {
909 // Perform immedate configuration of the package.
910 if ( SmartConfigure ( Pkg
, Depth
+ 1 ) == false )
911 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
912 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 2 );
918 // PM::OrderInstall - Installation ordering routine /*{{{*/
919 // ---------------------------------------------------------------------
921 pkgPackageManager :: OrderResult
pkgPackageManager :: OrderInstall ()
923 if ( CreateOrderList () == false )
929 clog
<< "Beginning to order" << endl
;
931 bool const ordering
=
932 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
933 List
-> OrderUnpack ( FileNames
) : List
-> OrderCritical ();
934 if ( ordering
== false )
936 _error
-> Error ( "Internal ordering error" );
941 clog
<< "Done ordering" << endl
;
943 bool DoneSomething
= false ;
944 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
946 PkgIterator
Pkg ( Cache
,* I
);
948 if ( List
-> IsNow ( Pkg
) == false )
951 clog
<< "Skipping already done " << Pkg
. FullName () << endl
;
955 if ( List
-> IsMissing ( Pkg
) == true )
958 clog
<< "Sequence completed at " << Pkg
. FullName () << endl
;
959 if ( DoneSomething
== false )
961 _error
-> Error ( "Internal Error, ordering was unable to handle the media swap" );
968 if ( Cache
[ Pkg
]. Keep () == true &&
969 Pkg
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
970 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
972 _error
-> Error ( "Internal Error, trying to manipulate a kept package ( %s )" , Pkg
. FullName (). c_str ());
976 // Perform a delete or an install
977 if ( Cache
[ Pkg
]. Delete () == true )
979 if ( SmartRemove ( Pkg
) == false )
983 if ( SmartUnPack ( Pkg
, List
-> IsFlag ( Pkg
, pkgOrderList :: Immediate
), 0 ) == false )
985 DoneSomething
= true ;
987 if ( ImmConfigureAll
) {
988 /* ConfigureAll here to pick up and packages left unconfigured because they were unpacked in the
989 "PreUnpack Checks" section */
995 // Final run through the configure phase
996 if ( ConfigureAll () == false )
1000 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
1002 if ( List
-> IsFlag (* I
, pkgOrderList :: Configured
) == false )
1004 _error
-> Error ( "Internal error, packages left unconfigured. %s " ,
1005 PkgIterator ( Cache
,* I
). FullName (). c_str ());
1012 // PM::DoInstallPostFork - compat /*{{{*/
1013 // ---------------------------------------------------------------------
1015 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1016 pkgPackageManager :: OrderResult
1017 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1019 APT :: Progress :: PackageManager
* progress
= new
1020 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1021 pkgPackageManager :: OrderResult res
= DoInstallPostFork ( progress
);
1026 // PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
1027 // ---------------------------------------------------------------------
1028 pkgPackageManager :: OrderResult
1029 pkgPackageManager :: DoInstallPostFork ( APT :: Progress :: PackageManager
* progress
)
1031 bool goResult
= Go ( progress
);
1032 if ( goResult
== false )
1038 pkgPackageManager :: OrderResult
1039 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1041 bool goResult
= Go ( statusFd
);
1042 if ( goResult
== false )
1049 // PM::DoInstall - Does the installation /*{{{*/
1050 // ---------------------------------------------------------------------
1052 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1053 pkgPackageManager :: OrderResult
1054 pkgPackageManager :: DoInstall ( int statusFd
)
1056 APT :: Progress :: PackageManager
* progress
= new
1057 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1058 OrderResult res
= DoInstall ( progress
);
1063 pkgPackageManager :: OrderResult
pkgPackageManager :: DoInstall ( int statusFd
)
1065 if ( DoInstallPreFork () == Failed
)
1068 return DoInstallPostFork ( statusFd
);
1072 // PM::DoInstall - Does the installation /*{{{*/
1073 // ---------------------------------------------------------------------
1074 /* This uses the filenames in FileNames and the information in the
1075 DepCache to perform the installation of packages.*/
1076 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1077 pkgPackageManager :: OrderResult
1078 pkgPackageManager :: DoInstall ( APT :: Progress :: PackageManager
* progress
)
1080 if ( DoInstallPreFork () == Failed
)
1083 return DoInstallPostFork ( progress
);