]>
git.saurik.com Git - apt.git/blob - apt-pkg/packagemanager.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: packagemanager.cc,v 1.30 2003/04/27 03:04:15 doogie Exp $
4 /* ######################################################################
6 Package Manager - Abstacts the package manager
8 More work is needed in the area of transitioning provides, ie exim
9 replacing smail. This can cause interesing side effects.
11 Other cases involving conflicts+replaces should be tested.
13 ##################################################################### */
15 // Include Files /*{{{*/
18 #include <apt-pkg/packagemanager.h>
19 #include <apt-pkg/orderlist.h>
20 #include <apt-pkg/depcache.h>
21 #include <apt-pkg/error.h>
22 #include <apt-pkg/version.h>
23 #include <apt-pkg/acquire-item.h>
24 #include <apt-pkg/algorithms.h>
25 #include <apt-pkg/configuration.h>
26 #include <apt-pkg/sptr.h>
27 #include <apt-pkg/macros.h>
28 #include <apt-pkg/pkgcache.h>
29 #include <apt-pkg/cacheiterators.h>
30 #include <apt-pkg/strutl.h>
41 bool pkgPackageManager :: SigINTStop
= false ;
43 // PM::PackageManager - Constructor /*{{{*/
44 // ---------------------------------------------------------------------
46 pkgPackageManager :: pkgPackageManager ( pkgDepCache
* pCache
) : Cache (* pCache
),
47 List ( NULL
), Res ( Incomplete
)
49 FileNames
= new string
[ Cache
. Head (). PackageCount
];
50 Debug
= _config
-> FindB ( "Debug::pkgPackageManager" , false );
51 NoImmConfigure
= ! _config
-> FindB ( "APT::Immediate-Configure" , true );
52 ImmConfigureAll
= _config
-> FindB ( "APT::Immediate-Configure-All" , false );
55 // PM::PackageManager - Destructor /*{{{*/
56 // ---------------------------------------------------------------------
58 pkgPackageManager ::~ pkgPackageManager ()
64 // PM::GetArchives - Queue the archives for download /*{{{*/
65 // ---------------------------------------------------------------------
67 bool pkgPackageManager :: GetArchives ( pkgAcquire
* Owner
, pkgSourceList
* Sources
,
70 if ( CreateOrderList () == false )
74 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
75 List
-> OrderUnpack () : List
-> OrderCritical ();
76 if ( ordering
== false )
77 return _error
-> Error ( "Internal ordering error" );
79 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
81 PkgIterator
Pkg ( Cache
,* I
);
82 FileNames
[ Pkg
-> ID
] = string ();
84 // Skip packages to erase
85 if ( Cache
[ Pkg
]. Delete () == true )
88 // Skip Packages that need configure only.
89 if ( Pkg
. State () == pkgCache :: PkgIterator :: NeedsConfigure
&&
90 Cache
[ Pkg
]. Keep () == true )
93 // Skip already processed packages
94 if ( List
-> IsNow ( Pkg
) == false )
97 new pkgAcqArchive ( Owner
, Sources
, Recs
, Cache
[ Pkg
]. InstVerIter ( Cache
),
104 // PM::FixMissing - Keep all missing packages /*{{{*/
105 // ---------------------------------------------------------------------
106 /* This is called to correct the installation when packages could not
108 bool pkgPackageManager :: FixMissing ()
110 pkgDepCache :: ActionGroup
group ( Cache
);
111 pkgProblemResolver
Resolve (& Cache
);
112 List
-> SetFileList ( FileNames
);
115 for ( PkgIterator I
= Cache
. PkgBegin (); I
. end () == false ; ++ I
)
117 if ( List
-> IsMissing ( I
) == false )
120 // Okay, this file is missing and we need it. Mark it for keep
122 Cache
. MarkKeep ( I
, false , false );
125 // We have to empty the list otherwise it will not have the new changes
132 // Now downgrade everything that is broken
133 return Resolve
. ResolveByKeep () == true && Cache
. BrokenCount () == 0 ;
136 // PM::ImmediateAdd - Add the immediate flag recursivly /*{{{*/
137 // ---------------------------------------------------------------------
138 /* This adds the immediate flag to the pkg and recursively to the
141 void pkgPackageManager :: ImmediateAdd ( PkgIterator I
, bool UseInstallVer
, unsigned const int & Depth
)
147 if ( Cache
[ I
]. InstallVer
== 0 )
149 D
= Cache
[ I
]. InstVerIter ( Cache
). DependsList ();
151 if ( I
-> CurrentVer
== 0 )
153 D
= I
. CurrentVer (). DependsList ();
156 for ( /* nothing */ ; D
. end () == false ; ++ D
)
157 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
159 if (! List
-> IsFlag ( D
. TargetPkg (), pkgOrderList :: Immediate
))
162 clog
<< OutputInDepth ( Depth
) << "ImmediateAdd(): Adding Immediate flag to " << D
. TargetPkg () << " cause of " << D
. DepType () << " " << I
. FullName () << endl
;
163 List
-> Flag ( D
. TargetPkg (), pkgOrderList :: Immediate
);
164 ImmediateAdd ( D
. TargetPkg (), UseInstallVer
, Depth
+ 1 );
170 // PM::CreateOrderList - Create the ordering class /*{{{*/
171 // ---------------------------------------------------------------------
172 /* This populates the ordering list with all the packages that are
174 bool pkgPackageManager :: CreateOrderList ()
180 List
= new pkgOrderList (& Cache
);
182 if ( Debug
&& ImmConfigureAll
)
183 clog
<< "CreateOrderList(): Adding Immediate flag for all packages because of APT::Immediate-Configure-All" << endl
;
185 // Generate the list of affected packages and sort it
186 for ( PkgIterator I
= Cache
. PkgBegin (); I
. end () == false ; ++ I
)
188 // Ignore no-version packages
189 if ( I
-> VersionList
== 0 )
192 // Mark the package and its dependends for immediate configuration
193 if (((( I
-> Flags
& pkgCache :: Flag :: Essential
) == pkgCache :: Flag :: Essential
) &&
194 NoImmConfigure
== false ) || ImmConfigureAll
)
196 if ( Debug
&& ! ImmConfigureAll
)
197 clog
<< "CreateOrderList(): Adding Immediate flag for " << I
. FullName () << endl
;
198 List
-> Flag ( I
, pkgOrderList :: Immediate
);
200 if (! ImmConfigureAll
) {
201 // Look for other install packages to make immediate configurea
202 ImmediateAdd ( I
, true );
204 // And again with the current version.
205 ImmediateAdd ( I
, false );
210 if (( Cache
[ I
]. Keep () == true ||
211 Cache
[ I
]. InstVerIter ( Cache
) == I
. CurrentVer ()) &&
212 I
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
213 ( Cache
[ I
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
&&
214 ( I
. Purge () != false || Cache
[ I
]. Mode
!= pkgDepCache :: ModeDelete
||
215 ( Cache
[ I
]. iFlags
& pkgDepCache :: Purge
) != pkgDepCache :: Purge
))
218 // Append it to the list
225 // PM::DepAlwaysTrue - Returns true if this dep is irrelevant /*{{{*/
226 // ---------------------------------------------------------------------
227 /* The restriction on provides is to eliminate the case when provides
228 are transitioning between valid states [ie exim to smail] */
229 bool pkgPackageManager :: DepAlwaysTrue ( DepIterator D
)
231 if ( D
. TargetPkg ()-> ProvidesList
!= 0 )
234 if (( Cache
[ D
] & pkgDepCache :: DepInstall
) != 0 &&
235 ( Cache
[ D
] & pkgDepCache :: DepNow
) != 0 )
240 // PM::CheckRConflicts - Look for reverse conflicts /*{{{*/
241 // ---------------------------------------------------------------------
242 /* This looks over the reverses for a conflicts line that needs early
244 bool pkgPackageManager :: CheckRConflicts ( PkgIterator Pkg
, DepIterator D
,
247 for (; D
. end () == false ; ++ D
)
249 if ( D
-> Type
!= pkgCache :: Dep :: Conflicts
&&
250 D
-> Type
!= pkgCache :: Dep :: Obsoletes
)
253 // The package hasn't been changed
254 if ( List
-> IsNow ( Pkg
) == false )
257 // Ignore self conflicts, ignore conflicts from irrelevant versions
258 if ( D
. IsIgnorable ( Pkg
) || D
. ParentVer () != D
. ParentPkg (). CurrentVer ())
261 if ( Cache
. VS (). CheckDep ( Ver
, D
-> CompareOp
, D
. TargetVer ()) == false )
264 if ( EarlyRemove ( D
. ParentPkg (), & D
) == false )
265 return _error
-> Error ( "Reverse conflicts early remove for package ' %s ' failed" ,
266 Pkg
. FullName (). c_str ());
271 // PM::ConfigureAll - Run the all out configuration /*{{{*/
272 // ---------------------------------------------------------------------
273 /* This configures every package. It is assumed they are all unpacked and
274 that the final configuration is valid. This is also used to catch packages
275 that have not been configured when using ImmConfigureAll */
276 bool pkgPackageManager :: ConfigureAll ()
278 pkgOrderList
OList (& Cache
);
280 // Populate the order list
281 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
282 if ( List
-> IsFlag ( pkgCache :: PkgIterator ( Cache
,* I
),
283 pkgOrderList :: UnPacked
) == true )
286 if ( OList
. OrderConfigure () == false )
289 std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
290 bool const ConfigurePkgs
= ( conf
== "all" );
292 // Perform the configuring
293 for ( pkgOrderList :: iterator I
= OList
. begin (); I
!= OList
. end (); ++ I
)
295 PkgIterator
Pkg ( Cache
,* I
);
297 /* Check if the package has been configured, this can happen if SmartConfigure
299 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
)) continue ;
301 if ( ConfigurePkgs
== true && SmartConfigure ( Pkg
, 0 ) == false ) {
303 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
304 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 1 );
306 _error
-> Error ( "Internal error, packages left unconfigured. %s " , Pkg
. FullName (). c_str ());
310 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
316 // PM::NonLoopingSmart - helper to avoid loops while calling Smart methods /*{{{*/
317 // -----------------------------------------------------------------------
318 /* ensures that a loop of the form A depends B, B depends A (and similar)
319 is not leading us down into infinite recursion segfault land */
320 bool pkgPackageManager :: NonLoopingSmart ( SmartAction
const action
, pkgCache :: PkgIterator
& Pkg
,
321 pkgCache :: PkgIterator DepPkg
, int const Depth
, bool const PkgLoop
,
322 bool * const Bad
, bool * const Changed
)
324 if ( PkgLoop
== false )
325 List
-> Flag ( Pkg
, pkgOrderList :: Loop
);
326 bool success
= false ;
329 case UNPACK_IMMEDIATE
: success
= SmartUnPack ( DepPkg
, true , Depth
+ 1 ); break ;
330 case UNPACK
: success
= SmartUnPack ( DepPkg
, false , Depth
+ 1 ); break ;
331 case CONFIGURE
: success
= SmartConfigure ( DepPkg
, Depth
+ 1 ); break ;
333 if ( PkgLoop
== false )
334 List
-> RmFlag ( Pkg
, pkgOrderList :: Loop
);
336 if ( success
== false )
341 if ( Changed
!= NULL
&& List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) == false )
346 // PM::SmartConfigure - Perform immediate configuration of the pkg /*{{{*/
347 // ---------------------------------------------------------------------
348 /* This function tries to put the system in a state where Pkg can be configured.
349 This involves checking each of Pkg's dependencies and unpacking and
350 configuring packages where needed. */
351 bool pkgPackageManager :: SmartConfigure ( PkgIterator Pkg
, int const Depth
)
353 // If this is true, only check and correct and dependencies without the Loop flag
354 bool const PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
357 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
358 clog
<< OutputInDepth ( Depth
) << "SmartConfigure " << Pkg
. FullName () << " (" << InstallVer
. VerStr () << ")" ;
360 clog
<< " (Only Correct Dependencies)" ;
364 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
366 /* Because of the ordered list, most dependencies should be unpacked,
367 however if there is a loop (A depends on B, B depends on A) this will not
368 be the case, so check for dependencies before configuring. */
369 bool Bad
= false , Changed
= false ;
370 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
372 std :: list
< DepIterator
> needConfigure
;
375 // Check each dependency and see if anything needs to be done
376 // so that it can be configured
378 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
380 // Compute a single dependency element (glob or)
381 pkgCache :: DepIterator Start
, End
;
384 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
388 // the first pass checks if we its all good, i.e. if we have
389 // to do anything at all
390 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
392 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
394 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
396 VerIterator
Ver ( Cache
,* I
);
397 PkgIterator DepPkg
= Ver
. ParentPkg ();
399 // Check if the current version of the package is available and will satisfy this dependency
400 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
401 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
402 DepPkg
. State () == PkgIterator :: NeedsNothing
)
408 // Check if the version that is going to be installed will satisfy the dependency
409 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
415 std :: clog
<< OutputInDepth ( Depth
) << "Package " << Pkg
<< " loops in SmartConfigure" << std :: endl
;
420 if ( Cur
== End
|| Bad
== false )
424 // this dependency is in a good state, so we can stop
428 std :: clog
<< OutputInDepth ( Depth
) << "Found ok dep " << D
. TargetPkg () << std :: endl
;
432 // Check for dependencies that have not been unpacked,
433 // probably due to loops.
434 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
436 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
438 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
440 VerIterator
Ver ( Cache
,* I
);
441 PkgIterator DepPkg
= Ver
. ParentPkg ();
443 // Check if the current version of the package is available and will satisfy this dependency
444 if ( DepPkg
. CurrentVer () == Ver
&& List
-> IsNow ( DepPkg
) == true &&
445 List
-> IsFlag ( DepPkg
, pkgOrderList :: Removed
) == false &&
446 DepPkg
. State () == PkgIterator :: NeedsNothing
)
449 // Check if the version that is going to be installed will satisfy the dependency
450 if ( Cache
[ DepPkg
]. InstallVer
!= * I
|| List
-> IsNow ( DepPkg
) == false )
456 std :: clog
<< OutputInDepth ( Depth
) << "Package " << Pkg
<< " loops in SmartConfigure" << std :: endl
;
462 clog
<< OutputInDepth ( Depth
) << "Unpacking " << DepPkg
. FullName () << " to avoid loop " << Cur
<< endl
;
463 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
466 // at this point we either unpacked a Dep or we are in a loop,
467 // no need to unpack a second one
471 if ( Cur
== End
|| Bad
== false )
478 needConfigure
. push_back ( Start
);
481 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (1) for %s , aborting" , Pkg
. FullName (). c_str ());
482 } while ( Changed
== true );
484 // now go over anything that needs configuring
485 Bad
= false , Changed
= false , i
= 0 ;
489 for ( std :: list
< DepIterator
>:: const_iterator D
= needConfigure
. begin (); D
!= needConfigure
. end (); ++ D
)
491 // Compute a single dependency element (glob or) without modifying D
492 pkgCache :: DepIterator Start
, End
;
494 pkgCache :: DepIterator Discard
= * D
;
495 Discard
. GlobOr ( Start
, End
);
498 if ( End
-> Type
!= pkgCache :: Dep :: Depends
)
502 // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
503 for ( DepIterator Cur
= Start
; true ; ++ Cur
)
505 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
507 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
509 VerIterator
Ver ( Cache
,* I
);
510 PkgIterator DepPkg
= Ver
. ParentPkg ();
512 // Check if the version that is going to be installed will satisfy the dependency
513 if ( Cache
[ DepPkg
]. InstallVer
!= * I
)
516 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
))
518 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Loop
) && PkgLoop
)
520 // This dependency has already been dealt with by another SmartConfigure on Pkg
525 std :: clog
<< OutputInDepth ( Depth
) << "Configure already unpacked " << DepPkg
<< std :: endl
;
526 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
531 else if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
537 if ( Cur
== End
|| Bad
== false )
542 if ( Bad
== true && Changed
== false && Debug
== true )
543 std :: clog
<< OutputInDepth ( Depth
) << "Could not satisfy " << * D
<< std :: endl
;
546 return _error
-> Error ( "Internal error: MaxLoopCount reached in SmartUnPack (2) for %s , aborting" , Pkg
. FullName (). c_str ());
547 } while ( Changed
== true );
550 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
552 if ( PkgLoop
) return true ;
554 static std :: string
const conf
= _config
-> Find ( "PackageManager::Configure" , "all" );
555 static bool const ConfigurePkgs
= ( conf
== "all" || conf
== "smart" );
557 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
))
558 return _error
-> Error ( "Internal configure error on ' %s '." , Pkg
. FullName (). c_str ());
560 if ( ConfigurePkgs
== true && Configure ( Pkg
) == false )
563 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
565 if (( Cache
[ Pkg
]. InstVerIter ( Cache
)-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
566 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
567 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
569 if ( Pkg
== P
|| List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
570 List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == false ||
571 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
572 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
574 if ( SmartConfigure ( P
, ( Depth
+ 1 )) == false )
579 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Configured
) == false )
580 return _error
-> Error ( _ ( "Could not configure ' %s '. " ), Pkg
. FullName (). c_str ());
585 // PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
586 // ---------------------------------------------------------------------
587 /* This is called to deal with conflicts arising from unpacking */
588 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
)
590 return EarlyRemove ( Pkg
, NULL
);
592 bool pkgPackageManager :: EarlyRemove ( PkgIterator Pkg
, DepIterator
const * const Dep
)
594 if ( List
-> IsNow ( Pkg
) == false )
597 // Already removed it
598 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
601 // Woops, it will not be re-installed!
602 if ( List
-> IsFlag ( Pkg
, pkgOrderList :: InList
) == false )
605 // these breaks on M-A:same packages can be dealt with. They 'loop' by design
606 if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
&& Dep
-> IsMultiArchImplicit () == true )
609 // Essential packages get special treatment
610 bool IsEssential
= false ;
611 if (( Pkg
-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
612 ( Pkg
-> Flags
& pkgCache :: Flag :: Important
) != 0 )
615 /* Check for packages that are the dependents of essential packages and
617 if ( Pkg
-> CurrentVer
!= 0 )
619 for ( pkgCache :: DepIterator D
= Pkg
. RevDependsList (); D
. end () == false &&
620 IsEssential
== false ; ++ D
)
621 if ( D
-> Type
== pkgCache :: Dep :: Depends
|| D
-> Type
== pkgCache :: Dep :: PreDepends
)
622 if (( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Essential
) != 0 ||
623 ( D
. ParentPkg ()-> Flags
& pkgCache :: Flag :: Important
) != 0 )
627 if ( IsEssential
== true )
629 if ( _config
-> FindB ( "APT::Force-LoopBreak" , false ) == false )
630 return _error
-> Error ( _ ( "This installation run will require temporarily "
631 "removing the essential package %s due to a "
632 "Conflicts/Pre-Depends loop. This is often bad, "
633 "but if you really want to do it, activate the "
634 "APT::Force-LoopBreak option." ), Pkg
. FullName (). c_str ());
636 // dpkg will auto-deconfigure it, no need for the big remove hammer
637 else if ( Dep
!= NULL
&& (* Dep
)-> Type
== pkgCache :: Dep :: DpkgBreaks
)
640 bool Res
= SmartRemove ( Pkg
);
641 if ( Cache
[ Pkg
]. Delete () == false )
642 List
-> Flag ( Pkg
, pkgOrderList :: Removed
, pkgOrderList :: States
);
647 // PM::SmartRemove - Removal Helper /*{{{*/
648 // ---------------------------------------------------------------------
650 bool pkgPackageManager :: SmartRemove ( PkgIterator Pkg
)
652 if ( List
-> IsNow ( Pkg
) == false )
655 List
-> Flag ( Pkg
, pkgOrderList :: Configured
, pkgOrderList :: States
);
657 return Remove ( Pkg
,( Cache
[ Pkg
]. iFlags
& pkgDepCache :: Purge
) == pkgDepCache :: Purge
);
660 // PM::SmartUnPack - Install helper /*{{{*/
661 // ---------------------------------------------------------------------
662 /* This puts the system in a state where it can Unpack Pkg, if Pkg is already
663 unpacked, or when it has been unpacked, if Immediate==true it configures it. */
664 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
)
666 return SmartUnPack ( Pkg
, true , 0 );
668 bool pkgPackageManager :: SmartUnPack ( PkgIterator Pkg
, bool const Immediate
, int const Depth
)
670 bool PkgLoop
= List
-> IsFlag ( Pkg
, pkgOrderList :: Loop
);
673 clog
<< OutputInDepth ( Depth
) << "SmartUnPack " << Pkg
. FullName ();
674 VerIterator InstallVer
= VerIterator ( Cache
, Cache
[ Pkg
]. InstallVer
);
675 if ( Pkg
. CurrentVer () == 0 )
676 clog
<< " (install version " << InstallVer
. VerStr () << ")" ;
678 clog
<< " (replace version " << Pkg
. CurrentVer (). VerStr () << " with " << InstallVer
. VerStr () << ")" ;
680 clog
<< " (Only Perform PreUnpack Checks)" ;
682 clog
<< " immediately" ;
686 VerIterator
const instVer
= Cache
[ Pkg
]. InstVerIter ( Cache
);
688 /* PreUnpack Checks: This loop checks and attempts to rectify any problems that would prevent the package being unpacked.
689 It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
690 avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
691 complex dependency structures, trying to configure some packages while breaking the loops can complicate things.
692 This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
693 or by the ConfigureAll call at the end of the for loop in OrderInstall. */
694 bool SomethingBad
= false , Changed
= false ;
695 bool couldBeTemporaryRemoved
= Depth
!= 0 && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == false ;
696 const unsigned int max_loops
= _config
-> FindI ( "APT::pkgPackageManager::MaxLoopCount" , 5000 );
701 for ( DepIterator D
= instVer
. DependsList (); D
. end () == false ; )
703 // Compute a single dependency element (glob or)
704 pkgCache :: DepIterator Start
, End
;
707 if ( End
-> Type
== pkgCache :: Dep :: PreDepends
)
711 clog
<< OutputInDepth ( Depth
) << "PreDepends order for " << Pkg
. FullName () << std :: endl
;
713 // Look for easy targets: packages that are already okay
714 for ( DepIterator Cur
= Start
; Bad
== true ; ++ Cur
)
716 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
717 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
719 VerIterator
Ver ( Cache
,* I
);
720 PkgIterator Pkg
= Ver
. ParentPkg ();
722 // See if the current version is ok
723 if ( Pkg
. CurrentVer () == Ver
&& List
-> IsNow ( Pkg
) == true &&
724 Pkg
. State () == PkgIterator :: NeedsNothing
)
728 clog
<< OutputInDepth ( Depth
) << "Found ok package " << Pkg
. FullName () << endl
;
736 // Look for something that could be configured.
737 for ( DepIterator Cur
= Start
; Bad
== true && Cur
. end () == false ; ++ Cur
)
739 SPtrArray
< Version
*> VList
= Cur
. AllTargets ();
740 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
742 VerIterator
Ver ( Cache
,* I
);
743 PkgIterator DepPkg
= Ver
. ParentPkg ();
745 // Not the install version
746 if ( Cache
[ DepPkg
]. InstallVer
!= * I
||
747 ( Cache
[ DepPkg
]. Keep () == true && DepPkg
. State () == PkgIterator :: NeedsNothing
))
750 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: Configured
))
756 // check if it needs unpack or if if configure is enough
757 if ( List
-> IsFlag ( DepPkg
, pkgOrderList :: UnPacked
) == false )
760 clog
<< OutputInDepth ( Depth
) << "Trying to SmartUnpack " << DepPkg
. FullName () << endl
;
761 if ( NonLoopingSmart ( UNPACK_IMMEDIATE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
767 clog
<< OutputInDepth ( Depth
) << "Trying to SmartConfigure " << DepPkg
. FullName () << endl
;
768 if ( NonLoopingSmart ( CONFIGURE
, Pkg
, DepPkg
, Depth
, PkgLoop
, & Bad
, & Changed
) == false )
778 else if ( End
-> Type
== pkgCache :: Dep :: Conflicts
||
779 End
-> Type
== pkgCache :: Dep :: Obsoletes
||
780 End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
782 SPtrArray
< Version
*> VList
= End
. AllTargets ();
783 for ( Version
** I
= VList
; * I
!= 0 ; ++ I
)
785 VerIterator
Ver ( Cache
,* I
);
786 PkgIterator ConflictPkg
= Ver
. ParentPkg ();
787 if ( ConflictPkg
. CurrentVer () != Ver
)
790 std :: clog
<< OutputInDepth ( Depth
) << "Ignore not-installed version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
794 if ( List
-> IsNow ( ConflictPkg
) == false )
797 std :: clog
<< OutputInDepth ( Depth
) << "Ignore already dealt-with version " << Ver
. VerStr () << " of " << ConflictPkg
. FullName () << " for " << End
<< std :: endl
;
801 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
804 clog
<< OutputInDepth ( Depth
) << "Ignoring " << End
<< " as " << ConflictPkg
. FullName () << "was temporarily removed" << endl
;
808 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Loop
) && PkgLoop
)
810 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
&& End
. IsMultiArchImplicit () == true )
813 clog
<< OutputInDepth ( Depth
) << "Because dependency is MultiArchImplicit we ignored looping on: " << ConflictPkg
<< endl
;
818 if ( End
-> Type
== pkgCache :: Dep :: DpkgBreaks
)
819 clog
<< OutputInDepth ( Depth
) << "Because of breaks knot, deconfigure " << ConflictPkg
. FullName () << " temporarily" << endl
;
821 clog
<< OutputInDepth ( Depth
) << "Because of conflict knot, removing " << ConflictPkg
. FullName () << " temporarily" << endl
;
823 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
824 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
829 if ( Cache
[ ConflictPkg
]. Delete () == false )
833 clog
<< OutputInDepth ( Depth
) << "Unpacking " << ConflictPkg
. FullName () << " to avoid " << End
;
835 clog
<< " (Looping)" ;
838 // we would like to avoid temporary removals and all that at best via a simple unpack
839 _error
-> PushToStack ();
840 if ( NonLoopingSmart ( UNPACK
, Pkg
, ConflictPkg
, Depth
, PkgLoop
, NULL
, & Changed
) == false )
842 // but if it fails ignore this failure and look for alternative ways of solving
845 clog
<< OutputInDepth ( Depth
) << "Avoidance unpack of " << ConflictPkg
. FullName () << " failed for " << End
<< std :: endl
;
846 _error
-> DumpErrors ( std :: clog
);
848 _error
-> RevertToStack ();
849 // ignorance can only happen if a) one of the offenders is already gone
850 if ( List
-> IsFlag ( ConflictPkg
, pkgOrderList :: Removed
) == true )
853 clog
<< OutputInDepth ( Depth
) << "But " << ConflictPkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
855 else if ( List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
858 clog
<< OutputInDepth ( Depth
) << "But " << Pkg
. FullName () << " was temporarily removed in the meantime to satisfy " << End
<< endl
;
860 // or b) we can make one go (removal or dpkg auto-deconfigure)
864 clog
<< OutputInDepth ( Depth
) << "So temprorary remove/deconfigure " << ConflictPkg
. FullName () << " to satisfy " << End
<< endl
;
865 if ( EarlyRemove ( ConflictPkg
, & End
) == false )
866 return _error
-> Error ( "Internal Error, Could not early remove %s (2)" , ConflictPkg
. FullName (). c_str ());
870 _error
-> MergeWithStack ();
875 clog
<< OutputInDepth ( Depth
) << "Removing " << ConflictPkg
. FullName () << " now to avoid " << End
<< endl
;
876 // no earlyremove() here as user has already agreed to the permanent removal
877 if ( SmartRemove ( Pkg
) == false )
878 return _error
-> Error ( "Internal Error, Could not early remove %s (1)" , ConflictPkg
. FullName (). c_str ());
884 return _error
-> Error ( "Internal error: APT::pkgPackageManager::MaxLoopCount reached in SmartConfigure for %s , aborting" , Pkg
. FullName (). c_str ());
885 } while ( Changed
== true );
887 if ( SomethingBad
== true )
888 return _error
-> Error ( "Couldn't configure %s , probably a dependency cycle." , Pkg
. FullName (). c_str ());
890 if ( couldBeTemporaryRemoved
== true && List
-> IsFlag ( Pkg
, pkgOrderList :: Removed
) == true )
893 std :: clog
<< OutputInDepth ( Depth
) << "Prevent unpack as " << Pkg
<< " is currently temporarily removed" << std :: endl
;
897 // Check for reverse conflicts.
898 if ( CheckRConflicts ( Pkg
, Pkg
. RevDependsList (),
899 instVer
. VerStr ()) == false )
902 for ( PrvIterator P
= instVer
. ProvidesList ();
903 P
. end () == false ; ++ P
)
904 if ( Pkg
-> Group
!= P
. OwnerPkg ()-> Group
)
905 CheckRConflicts ( Pkg
, P
. ParentPkg (). RevDependsList (), P
. ProvideVersion ());
910 List
-> Flag ( Pkg
, pkgOrderList :: UnPacked
, pkgOrderList :: States
);
912 if ( Immediate
== true && ( instVer
-> MultiArch
& pkgCache :: Version :: Same
) == pkgCache :: Version :: Same
)
914 /* Do lockstep M-A:same unpacking in two phases:
915 First unpack all installed architectures, then the not installed.
916 This way we avoid that M-A: enabled packages are installed before
917 their older non-M-A enabled packages are replaced by newer versions */
918 bool const installed
= Pkg
-> CurrentVer
!= 0 ;
919 if ( installed
== true &&
920 ( instVer
!= Pkg
. CurrentVer () ||
921 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
922 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
924 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
925 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
927 if ( P
-> CurrentVer
== 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
928 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
929 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
931 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
934 if ( installed
== false && Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
936 for ( PkgIterator P
= Pkg
. Group (). PackageList ();
937 P
. end () == false ; P
= Pkg
. Group (). NextPkg ( P
))
939 if ( P
-> CurrentVer
!= 0 || P
== Pkg
|| List
-> IsFlag ( P
, pkgOrderList :: UnPacked
) == true ||
940 List
-> IsFlag ( P
, pkgOrderList :: Configured
) == true ||
941 Cache
[ P
]. InstallVer
== 0 || ( P
. CurrentVer () == Cache
[ P
]. InstallVer
&&
942 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
))
944 if ( SmartUnPack ( P
, false , Depth
+ 1 ) == false )
948 // packages which are already unpacked don't need to be unpacked again
949 else if (( instVer
!= Pkg
. CurrentVer () ||
950 (( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) == pkgDepCache :: ReInstall
)) &&
951 Install ( Pkg
, FileNames
[ Pkg
-> ID
]) == false )
954 if ( Immediate
== true ) {
955 // Perform immedate configuration of the package.
956 if ( SmartConfigure ( Pkg
, Depth
+ 1 ) == false )
957 _error
-> Error ( _ ( "Could not perform immediate configuration on ' %s '. "
958 "Please see man 5 apt.conf under APT::Immediate-Configure for details. ( %d )" ), Pkg
. FullName (). c_str (), 2 );
964 // PM::OrderInstall - Installation ordering routine /*{{{*/
965 // ---------------------------------------------------------------------
967 pkgPackageManager :: OrderResult
pkgPackageManager :: OrderInstall ()
969 if ( CreateOrderList () == false )
975 clog
<< "Beginning to order" << endl
;
977 bool const ordering
=
978 _config
-> FindB ( "PackageManager::UnpackAll" , true ) ?
979 List
-> OrderUnpack ( FileNames
) : List
-> OrderCritical ();
980 if ( ordering
== false )
982 _error
-> Error ( "Internal ordering error" );
987 clog
<< "Done ordering" << endl
;
989 bool DoneSomething
= false ;
990 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
992 PkgIterator
Pkg ( Cache
,* I
);
994 if ( List
-> IsNow ( Pkg
) == false )
997 clog
<< "Skipping already done " << Pkg
. FullName () << endl
;
1001 if ( List
-> IsMissing ( Pkg
) == true )
1004 clog
<< "Sequence completed at " << Pkg
. FullName () << endl
;
1005 if ( DoneSomething
== false )
1007 _error
-> Error ( "Internal Error, ordering was unable to handle the media swap" );
1014 if ( Cache
[ Pkg
]. Keep () == true &&
1015 Pkg
. State () == pkgCache :: PkgIterator :: NeedsNothing
&&
1016 ( Cache
[ Pkg
]. iFlags
& pkgDepCache :: ReInstall
) != pkgDepCache :: ReInstall
)
1018 _error
-> Error ( "Internal Error, trying to manipulate a kept package ( %s )" , Pkg
. FullName (). c_str ());
1022 // Perform a delete or an install
1023 if ( Cache
[ Pkg
]. Delete () == true )
1025 if ( SmartRemove ( Pkg
) == false )
1029 if ( SmartUnPack ( Pkg
, List
-> IsFlag ( Pkg
, pkgOrderList :: Immediate
), 0 ) == false )
1031 DoneSomething
= true ;
1033 if ( ImmConfigureAll
) {
1034 /* ConfigureAll here to pick up and packages left unconfigured because they were unpacked in the
1035 "PreUnpack Checks" section */
1036 if (! ConfigureAll ())
1041 // Final run through the configure phase
1042 if ( ConfigureAll () == false )
1046 for ( pkgOrderList :: iterator I
= List
-> begin (); I
!= List
-> end (); ++ I
)
1048 if ( List
-> IsFlag (* I
, pkgOrderList :: Configured
) == false )
1050 _error
-> Error ( "Internal error, packages left unconfigured. %s " ,
1051 PkgIterator ( Cache
,* I
). FullName (). c_str ());
1058 // PM::DoInstallPostFork - compat /*{{{*/
1059 // ---------------------------------------------------------------------
1061 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1062 pkgPackageManager :: OrderResult
1063 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1065 APT :: Progress :: PackageManager
* progress
= new
1066 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1067 pkgPackageManager :: OrderResult res
= DoInstallPostFork ( progress
);
1072 // PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
1073 // ---------------------------------------------------------------------
1074 pkgPackageManager :: OrderResult
1075 pkgPackageManager :: DoInstallPostFork ( APT :: Progress :: PackageManager
* progress
)
1077 bool goResult
= Go ( progress
);
1078 if ( goResult
== false )
1084 pkgPackageManager :: OrderResult
1085 pkgPackageManager :: DoInstallPostFork ( int statusFd
)
1087 bool goResult
= Go ( statusFd
);
1088 if ( goResult
== false )
1095 // PM::DoInstall - Does the installation /*{{{*/
1096 // ---------------------------------------------------------------------
1098 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1099 pkgPackageManager :: OrderResult
1100 pkgPackageManager :: DoInstall ( int statusFd
)
1102 APT :: Progress :: PackageManager
* progress
= new
1103 APT :: Progress :: PackageManagerProgressFd ( statusFd
);
1104 OrderResult res
= DoInstall ( progress
);
1109 pkgPackageManager :: OrderResult
pkgPackageManager :: DoInstall ( int statusFd
)
1111 if ( DoInstallPreFork () == Failed
)
1114 return DoInstallPostFork ( statusFd
);
1118 // PM::DoInstall - Does the installation /*{{{*/
1119 // ---------------------------------------------------------------------
1120 /* This uses the filenames in FileNames and the information in the
1121 DepCache to perform the installation of packages.*/
1122 #if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
1123 pkgPackageManager :: OrderResult
1124 pkgPackageManager :: DoInstall ( APT :: Progress :: PackageManager
* progress
)
1126 if ( DoInstallPreFork () == Failed
)
1129 return DoInstallPostFork ( progress
);