]>
git.saurik.com Git - apt.git/blob - apt-pkg/packagemanager.cc
ba48c53ccbc9598312517305b2146cc8756f5b60
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
;
376 // Check each dependency and see if anything needs to be done
377 // so that it can be configured
379 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
381 // Compute a single dependency element (glob or)
382 pkgCache :: DepIterator Start
, End
;
385 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
389 // the first pass checks if we its all good, i.e. if we have
390 // to do anything at all
391 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
393 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
395 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
397 VerIterator
Ver ( Cache
,* I
);
398 PkgIterator DepPkg
= Ver
. ParentPkg ();
400 // Check if the current version of the package is available and will satisfy this dependency
401 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
402 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
403 DepPkg
. State () == PkgIterator :: NeedsNothing
)
409 // Check if the version that is going to be installed will satisfy the dependency
410 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
416 std :: clog
<< OutputInDepth ( Depth
) << "Package " << Pkg
<< " loops in SmartConfigure" << std :: endl
;
421 if ( Cur
== End
|| Bad
== false )
425 // this dependency is in a good state, so we can stop
429 std :: clog
<< OutputInDepth ( Depth
) << "Found ok dep " << D
. TargetPkg () << std :: endl
;
433 // Check for dependencies that have not been unpacked,
434 // probably due to loops.
435 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
437 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
439 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
441 VerIterator
Ver ( Cache
,* I
);
442 PkgIterator DepPkg
= Ver
. ParentPkg ();
444 // Check if the current version of the package is available and will satisfy this dependency
445 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
446 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
447 DepPkg
. State () == PkgIterator :: NeedsNothing
)
450 // Check if the version that is going to be installed will satisfy the dependency
451 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
457 std :: clog
<< OutputInDepth ( Depth
) << "Package " << Pkg
<< " loops in SmartConfigure" << std :: endl
;
463 clog
<< OutputInDepth ( Depth
) << "Unpacking " << DepPkg
. FullName () << " to avoid loop " << Cur
<< endl
;
464 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
467 // at this point we either unpacked a Dep or we are in a loop,
468 // no need to unpack a second one
472 if ( Cur
== End
|| Bad
== false )
479 needConfigure
. push_back ( Start
);
482 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (1) for %s , aborting" , Pkg
. FullName (). c_str ());
483 } while ( Changed
== true );
485 // now go over anything that needs configuring
486 Bad
= false , Changed
= false , i
= 0 ;
490 for ( std :: list
< DepIterator
>:: const_iterator D
= needConfigure
. begin (); D
!= needConfigure
. end (); ++ D
)
492 // Compute a single dependency element (glob or) without modifying D
493 pkgCache :: DepIterator Start
, End
;
495 pkgCache :: DepIterator Discard
= * D
;
496 Discard
. GlobOr ( Start
, End
);
499 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
503 // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
504 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
506 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
508 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
510 VerIterator
Ver ( Cache
,* I
);
511 PkgIterator DepPkg
= Ver
. ParentPkg ();
513 // Check if the version that is going to be installed will satisfy the dependency
514 if ( Cache
[ DepPkg
]. InstallVer
!= * I
)
517 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
))
519 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) && PkgLoop
)
521 // This dependency has already been dealt with by another SmartConfigure on Pkg
526 std :: clog
<< OutputInDepth ( Depth
) << "Configure already unpacked " << DepPkg
<< std :: endl
;
527 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
532 else if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
538 if ( Cur
== End
|| Bad
== false )
543 if ( Bad
== true && Changed
== false && Debug
== true )
544 std :: clog
<< OutputInDepth ( Depth
) << "Could not satisfy " << * D
<< std :: endl
;
547 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (2) for %s , aborting" , Pkg
. FullName (). c_str ());
548 } while ( Changed
== true );
551 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
553 if ( PkgLoop
) return true ;
555 static std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
556 static bool const ConfigurePkgs
= ( conf
== "all" || conf
== "smart" );
558 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
))
559 return _error
-> Error ( "Internal configure error on ' %s '." , Pkg
. FullName (). c_str ());
561 if ( ConfigurePkgs
== true && Configure ( Pkg
) == false )
564 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
566 if (( Cache
[ Pkg
]. InstVerIter ( Cache
)-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
567 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
568 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
570 if ( Pkg
== P
|| List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
571 List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == false ||
572 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
573 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
575 if ( SmartConfigure ( P
, ( Depth
+ 1 )) == false )
580 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
) == false )
581 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
586 // PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
587 // ---------------------------------------------------------------------
588 /* This is called to deal with conflicts arising from unpacking */
589 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
)
591 return EarlyRemove ( Pkg
, NULL
);
593 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
, DepIterator
const * const Dep
)
595 if ( List
-> IsNow ( Pkg
) == false )
598 // Already removed it
599 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
602 // Woops, it will not be re-installed!
603 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: InList
) == false )
606 // these breaks on M-A:same packages can be dealt with. They 'loop' by design
607 if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
&& Dep
-> IsMultiArchImplicit () == true )
610 // Essential packages get special treatment
611 bool IsEssential
= false ;
612 if (( Pkg
-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
613 ( Pkg
-> Flags
& pkgCache :: Flag :: Important
) != 0 )
616 /* Check for packages that are the dependents of essential packages and
618 if ( Pkg
-> CurrentVer
!= 0 )
620 for ( pkgCache :: DepIterator D
= Pkg
. RevDependsList (); D
. end () == false &&
621 IsEssential
== false ; ++ D
)
622 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
623 if (( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
624 ( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Important
) != 0 )
628 if ( IsEssential
== true )
630 if ( _config
-> FindB ( "APT::Force-LoopBreak" , false ) == false )
631 return _error
-> Error ( _ ( "This installation run will require temporarily "
632 "removing the essential package %s due to a "
633 "Conflicts/Pre-Depends loop. This is often bad, "
634 "but if you really want to do it, activate the "
635 "APT::Force-LoopBreak option." ), Pkg
. FullName (). c_str ());
637 // dpkg will auto-deconfigure it, no need for the big remove hammer
638 else if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
)
641 bool Res
= SmartRemove ( Pkg
);
642 if ( Cache
[ Pkg
]. Delete () == false )
643 List
-> Flag ( Pkg
, pkgOrderList :: Removed
, pkgOrderList :: States
);
648 // PM::SmartRemove - Removal Helper /*{{{*/
649 // ---------------------------------------------------------------------
651 bool pkgPackageManager :: SmartRemove ( PkgIterator Pkg
)
653 if ( List
-> IsNow ( Pkg
) == false )
656 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
658 return Remove ( Pkg
,( Cache
[ Pkg
]. iFlags
& pkgDepCache :: Purge
) == pkgDepCache :: Purge
);
661 // PM::SmartUnPack - Install helper /*{{{*/
662 // ---------------------------------------------------------------------
663 /* This puts the system in a state where it can Unpack Pkg, if Pkg is already
664 unpacked, or when it has been unpacked, if Immediate==true it configures it. */
665 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
)
667 return SmartUnPack ( Pkg
, true , 0 );
669 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
, bool const Immediate
, int const Depth
)
671 bool PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
674 clog
<< OutputInDepth ( Depth
) << "SmartUnPack " << Pkg
. FullName ();
675 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
676 if ( Pkg
. CurrentVer () == 0 )
677 clog
<< " (install version " << InstallVer
. VerStr () << ")" ;
679 clog
<< " (replace version " << Pkg
. CurrentVer (). VerStr () << " with " << InstallVer
. VerStr () << ")" ;
681 clog
<< " (Only Perform PreUnpack Checks)" ;
683 clog
<< " immediately" ;
687 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
689 /* PreUnpack Checks: This loop checks and attempts to rectify any problems that would prevent the package being unpacked.
690 It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
691 avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
692 complex dependency structures, trying to configure some packages while breaking the loops can complicate things.
693 This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
694 or by the ConfigureAll call at the end of the for loop in OrderInstall. */
695 bool SomethingBad
= false , Changed
= false ;
696 bool couldBeTemporaryRemoved
= Depth
!= 0 && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == false ;
697 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
702 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
704 // Compute a single dependency element (glob or)
705 pkgCache :: DepIterator Start
, End
;
708 if ( End
-> Type
== pkgCache :: Dep :: PreDepends
)
712 clog
<< OutputInDepth ( Depth
) << "PreDepends order for " << Pkg
. FullName () << std :: endl
;
714 // Look for easy targets: packages that are already okay
715 for ( DepIterator Cur
= Start
; Bad
== true ; ++ Cur
)
717 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
718 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
720 VerIterator
Ver ( Cache
,* I
);
721 PkgIterator Pkg
= Ver
. ParentPkg ();
723 // See if the current version is ok
724 if ( Pkg
. CurrentVer () == Ver
&& List
-> IsNow ( Pkg
) == true &&
725 Pkg
. State () == PkgIterator :: NeedsNothing
)
729 clog
<< OutputInDepth ( Depth
) << "Found ok package " << Pkg
. FullName () << endl
;
737 // Look for something that could be configured.
738 for ( DepIterator Cur
= Start
; Bad
== true && Cur
. end () == false ; ++ Cur
)
740 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
741 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
743 VerIterator
Ver ( Cache
,* I
);
744 PkgIterator DepPkg
= Ver
. ParentPkg ();
746 // Not the install version
747 if ( Cache
[ DepPkg
]. InstallVer
!= * I
||
748 ( Cache
[ DepPkg
]. Keep () == true && DepPkg
. State () == PkgIterator :: NeedsNothing
))
751 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
757 // check if it needs unpack or if if configure is enough
758 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
) == false )
761 clog
<< OutputInDepth ( Depth
) << "Trying to SmartUnpack " << DepPkg
. FullName () << endl
;
762 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
768 clog
<< OutputInDepth ( Depth
) << "Trying to SmartConfigure " << DepPkg
. FullName () << endl
;
769 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
779 else if ( End
-> Type
== pkgCache :: Dep :: Conflicts
||
780 End
-> Type
== pkgCache :: Dep :: Obsoletes
||
781 End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
783 SPtrArray
< Version
*> VList
= End
. AllTargets ();
784 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
786 VerIterator
Ver ( Cache
,* I
);
787 PkgIterator ConflictPkg
= Ver
. ParentPkg ();
788 if ( ConflictPkg
. CurrentVer () != Ver
)
791 std :: clog
<< OutputInDepth ( Depth
) << "Ignore not-installed version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
795 if ( List
-> IsNow ( ConflictPkg
) == false )
798 std :: clog
<< OutputInDepth ( Depth
) << "Ignore already dealt-with version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
802 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
805 clog
<< OutputInDepth ( Depth
) << "Ignoring " << End
<< " as " << ConflictPkg
. FullName () << "was temporarily removed" << endl
;
809 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Loop
) && PkgLoop
)
811 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
&& End
. IsMultiArchImplicit () == true )
814 clog
<< OutputInDepth ( Depth
) << "Because dependency is MultiArchImplicit we ignored looping on: " << ConflictPkg
<< endl
;
819 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
820 clog
<< OutputInDepth ( Depth
) << "Because of breaks knot, deconfigure " << ConflictPkg
. FullName () << " temporarily" << endl
;
822 clog
<< OutputInDepth ( Depth
) << "Because of conflict knot, removing " << ConflictPkg
. FullName () << " temporarily" << endl
;
824 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
825 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
830 if ( Cache
[ ConflictPkg
]. Delete () == false )
834 clog
<< OutputInDepth ( Depth
) << "Unpacking " << ConflictPkg
. FullName () << " to avoid " << End
;
836 clog
<< " (Looping)" ;
839 // we would like to avoid temporary removals and all that at best via a simple unpack
840 _error
-> PushToStack ();
841 if ( NonLoopingSmart ( UNPACK
, Pkg
, ConflictPkg
, Depth
, PkgLoop
, NULL
, & Changed
) == false )
843 // but if it fails ignore this failure and look for alternative ways of solving
846 clog
<< OutputInDepth ( Depth
) << "Avoidance unpack of " << ConflictPkg
. FullName () << " failed for " << End
<< " ignoring:" << std :: endl
;
847 _error
-> DumpErrors ( std :: clog
);
849 _error
-> RevertToStack ();
850 // ignorance can only happen if a) one of the offenders is already gone
851 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
854 clog
<< OutputInDepth ( Depth
) << "But " << ConflictPkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
856 else if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
859 clog
<< OutputInDepth ( Depth
) << "But " << Pkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
861 // or b) we can make one go (removal or dpkg auto-deconfigure)
865 clog
<< OutputInDepth ( Depth
) << "So temprorary remove/deconfigure " << ConflictPkg
. FullName () << " to satisfy " << End
<< endl
;
866 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
867 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
871 _error
-> MergeWithStack ();
876 clog
<< OutputInDepth ( Depth
) << "Removing " << ConflictPkg
. FullName () << " now to avoid " << End
<< endl
;
877 // no earlyremove() here as user has already agreed to the permanent removal
878 if ( SmartRemove ( Pkg
) == false )
879 return _error
-> Error ( "Internal Error, Could not early remove %s (1)" , ConflictPkg
. FullName (). c_str ());
885 return _error
-> Error ( "Internal error: APT::pkgPackageManager::MaxLoopCount reached in SmartConfigure for %s , aborting" , Pkg
. FullName (). c_str ());
886 } while ( Changed
== true );
888 if ( SomethingBad
== true )
889 return _error
-> Error ( "Couldn't configure %s , probably a dependency cycle." , Pkg
. FullName (). c_str ());
891 if ( couldBeTemporaryRemoved
== true && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
894 std :: clog
<< OutputInDepth ( Depth
) << "Prevent unpack as " << Pkg
<< " is currently temporarily removed" << std :: endl
;
898 // Check for reverse conflicts.
899 if ( CheckRConflicts ( Pkg
, Pkg
. RevDependsList (),
900 instVer
. VerStr ()) == false )
903 for ( PrvIterator P
= instVer
. ProvidesList ();
904 P
. end () == false ; ++ P
)
905 if ( Pkg
-> Group
!= P
. OwnerPkg ()-> Group
)
906 CheckRConflicts ( Pkg
, P
. ParentPkg (). RevDependsList (), P
. ProvideVersion ());
911 List
-> Flag ( Pkg
, pkgOrderList :: UnPacked
, pkgOrderList :: States
);
913 if ( Immediate
== true && ( instVer
-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
915 /* Do lockstep M-A:same unpacking in two phases:
916 First unpack all installed architectures, then the not installed.
917 This way we avoid that M-A: enabled packages are installed before
918 their older non-M-A enabled packages are replaced by newer versions */
919 bool const installed
= Pkg
-> CurrentVer
!= 0 ;
920 if ( installed
== true &&
921 ( instVer
!= Pkg
. CurrentVer () ||
922 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
923 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
925 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
926 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
928 if ( P
-> CurrentVer
== 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
929 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
930 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
932 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
935 if ( installed
== false && Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
937 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
938 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
940 if ( P
-> CurrentVer
!= 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
941 List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
942 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
943 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
945 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
949 // packages which are already unpacked don't need to be unpacked again
950 else if (( instVer
!= Pkg
. CurrentVer () ||
951 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
952 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
955 if ( Immediate
== true ) {
956 // Perform immedate configuration of the package.
957 if ( SmartConfigure ( Pkg
, Depth
+ 1 ) == false )
958 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
959 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 2 );
965 // PM::OrderInstall - Installation ordering routine /*{{{*/
966 // ---------------------------------------------------------------------
968 pkgPackageManager :: OrderResult
pkgPackageManager :: OrderInstall ()
970 if ( CreateOrderList () == false )
976 clog
<< "Beginning to order" << endl
;
978 bool const ordering
=
979 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
980 List
-> OrderUnpack ( FileNames
) : List
-> OrderCritical ();
981 if ( ordering
== false )
983 _error
-> Error ( "Internal ordering error" );
988 clog
<< "Done ordering" << endl
;
990 bool DoneSomething
= false ;
991 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
993 PkgIterator
Pkg ( Cache
,* I
);
995 if ( List
-> IsNow ( Pkg
) == false )
998 clog
<< "Skipping already done " << Pkg
. FullName () << endl
;
1002 if ( List
-> IsMissing ( Pkg
) == true )
1005 clog
<< "Sequence completed at " << Pkg
. FullName () << endl
;
1006 if ( DoneSomething
== false )
1008 _error
-> Error ( "Internal Error, ordering was unable to handle the media swap" );
1015 if ( Cache
[ Pkg
]. Keep () == true &&
1016 Pkg
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
1017 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
1019 _error
-> Error ( "Internal Error, trying to manipulate a kept package ( %s )" , Pkg
. FullName (). c_str ());
1023 // Perform a delete or an install
1024 if ( Cache
[ Pkg
]. Delete () == true )
1026 if ( SmartRemove ( Pkg
) == false )
1030 if ( SmartUnPack ( Pkg
, List
-> IsFlag ( Pkg
, pkgOrderList :: Immediate
), 0 ) == false )
1032 DoneSomething
= true ;
1034 if ( ImmConfigureAll
) {
1035 /* ConfigureAll here to pick up and packages left unconfigured because they were unpacked in the
1036 "PreUnpack Checks" section */
1037 if (! ConfigureAll ())
1042 // Final run through the configure phase
1043 if ( ConfigureAll () == false )
1047 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
1049 if ( List
-> IsFlag (* I
, pkgOrderList :: Configured
) == false )
1051 _error
-> Error ( "Internal error, packages left unconfigured. %s " ,
1052 PkgIterator ( Cache
,* I
). FullName (). c_str ());
1059 // PM::DoInstallPostFork - compat /*{{{*/
1060 // ---------------------------------------------------------------------
1062 #if APT_PKG_ABI >= 413
1063 pkgPackageManager :: OrderResult
1064 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1066 APT :: Progress :: PackageManager
* progress
= new
1067 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1068 pkgPackageManager :: OrderResult res
= DoInstallPostFork ( progress
);
1073 // PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
1074 // ---------------------------------------------------------------------
1075 pkgPackageManager :: OrderResult
1076 pkgPackageManager :: DoInstallPostFork ( APT :: Progress :: PackageManager
* progress
)
1078 bool goResult
= Go ( progress
);
1079 if ( goResult
== false )
1085 pkgPackageManager :: OrderResult
1086 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1088 bool goResult
= Go ( statusFd
);
1089 if ( goResult
== false )
1096 // PM::DoInstall - Does the installation /*{{{*/
1097 // ---------------------------------------------------------------------
1099 #if APT_PKG_ABI >= 413
1100 pkgPackageManager :: OrderResult
1101 pkgPackageManager :: DoInstall ( int statusFd
)
1103 APT :: Progress :: PackageManager
* progress
= new
1104 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1105 OrderResult res
= DoInstall ( progress
);
1110 pkgPackageManager :: OrderResult
pkgPackageManager :: DoInstall ( int statusFd
)
1112 if ( DoInstallPreFork () == Failed
)
1115 return DoInstallPostFork ( statusFd
);
1119 // PM::DoInstall - Does the installation /*{{{*/
1120 // ---------------------------------------------------------------------
1121 /* This uses the filenames in FileNames and the information in the
1122 DepCache to perform the installation of packages.*/
1123 #if APT_PKG_ABI >= 413
1124 pkgPackageManager :: OrderResult
1125 pkgPackageManager :: DoInstall ( APT :: Progress :: PackageManager
* progress
)
1127 if ( DoInstallPreFork () == Failed
)
1130 return DoInstallPostFork ( progress
);