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 /*{{{*/
16 #include <apt-pkg/packagemanager.h>
17 #include <apt-pkg/orderlist.h>
18 #include <apt-pkg/depcache.h>
19 #include <apt-pkg/error.h>
20 #include <apt-pkg/version.h>
21 #include <apt-pkg/acquire-item.h>
22 #include <apt-pkg/algorithms.h>
23 #include <apt-pkg/configuration.h>
24 #include <apt-pkg/sptr.h>
32 // PM::PackageManager - Constructor /*{{{*/
33 // ---------------------------------------------------------------------
35 pkgPackageManager::pkgPackageManager(pkgDepCache
*pCache
) : Cache(*pCache
)
37 FileNames
= new string
[Cache
.Head().PackageCount
];
39 Debug
= _config
->FindB("Debug::pkgPackageManager",false);
42 // PM::PackageManager - Destructor /*{{{*/
43 // ---------------------------------------------------------------------
45 pkgPackageManager::~pkgPackageManager()
51 // PM::GetArchives - Queue the archives for download /*{{{*/
52 // ---------------------------------------------------------------------
54 bool pkgPackageManager::GetArchives(pkgAcquire
*Owner
,pkgSourceList
*Sources
,
57 if (CreateOrderList() == false)
61 _config
->FindB("PackageManager::UnpackAll",true) ?
62 List
->OrderUnpack() : List
->OrderCritical();
63 if (ordering
== false)
64 return _error
->Error("Internal ordering error");
66 for (pkgOrderList::iterator I
= List
->begin(); I
!= List
->end(); I
++)
68 PkgIterator
Pkg(Cache
,*I
);
69 FileNames
[Pkg
->ID
] = string();
71 // Skip packages to erase
72 if (Cache
[Pkg
].Delete() == true)
75 // Skip Packages that need configure only.
76 if (Pkg
.State() == pkgCache::PkgIterator::NeedsConfigure
&&
77 Cache
[Pkg
].Keep() == true)
80 // Skip already processed packages
81 if (List
->IsNow(Pkg
) == false)
84 new pkgAcqArchive(Owner
,Sources
,Recs
,Cache
[Pkg
].InstVerIter(Cache
),
91 // PM::FixMissing - Keep all missing packages /*{{{*/
92 // ---------------------------------------------------------------------
93 /* This is called to correct the installation when packages could not
95 bool pkgPackageManager::FixMissing()
97 pkgDepCache::ActionGroup
group(Cache
);
98 pkgProblemResolver
Resolve(&Cache
);
99 List
->SetFileList(FileNames
);
102 for (PkgIterator I
= Cache
.PkgBegin(); I
.end() == false; I
++)
104 if (List
->IsMissing(I
) == false)
107 // Okay, this file is missing and we need it. Mark it for keep
109 Cache
.MarkKeep(I
, false, false);
112 // We have to empty the list otherwise it will not have the new changes
119 // Now downgrade everything that is broken
120 return Resolve
.ResolveByKeep() == true && Cache
.BrokenCount() == 0;
123 // PM::ImmediateAdd - Add the immediate flag recursivly /*{{{*/
124 // ---------------------------------------------------------------------
125 /* This adds the immediate flag to the pkg and recursively to the
128 void pkgPackageManager::ImmediateAdd(PkgIterator I
, bool UseInstallVer
, unsigned const int &Depth
)
134 if(Cache
[I
].InstallVer
== 0)
136 D
= Cache
[I
].InstVerIter(Cache
).DependsList();
138 if (I
->CurrentVer
== 0)
140 D
= I
.CurrentVer().DependsList();
143 for ( /* nothing */ ; D
.end() == false; D
++)
144 if (D
->Type
== pkgCache::Dep::Depends
|| D
->Type
== pkgCache::Dep::PreDepends
)
146 if(!List
->IsFlag(D
.TargetPkg(), pkgOrderList::Immediate
))
149 clog
<< OutputInDepth(Depth
) << "ImmediateAdd(): Adding Immediate flag to " << D
.TargetPkg() << " cause of " << D
.DepType() << " " << I
.Name() << endl
;
150 List
->Flag(D
.TargetPkg(),pkgOrderList::Immediate
);
151 ImmediateAdd(D
.TargetPkg(), UseInstallVer
, Depth
+ 1);
157 // PM::CreateOrderList - Create the ordering class /*{{{*/
158 // ---------------------------------------------------------------------
159 /* This populates the ordering list with all the packages that are
161 bool pkgPackageManager::CreateOrderList()
167 List
= new pkgOrderList(&Cache
);
169 static bool const NoImmConfigure
= !_config
->FindB("APT::Immediate-Configure",true);
171 // Generate the list of affected packages and sort it
172 for (PkgIterator I
= Cache
.PkgBegin(); I
.end() == false; I
++)
174 // Ignore no-version packages
175 if (I
->VersionList
== 0)
178 // Mark the package and its dependends for immediate configuration
179 if (((I
->Flags
& pkgCache::Flag::Essential
) == pkgCache::Flag::Essential
||
180 (I
->Flags
& pkgCache::Flag::Important
) == pkgCache::Flag::Important
) &&
181 NoImmConfigure
== false)
184 clog
<< "CreateOrderList(): Adding Immediate flag for " << I
.Name() << endl
;
185 List
->Flag(I
,pkgOrderList::Immediate
);
187 // Look for other install packages to make immediate configurea
188 ImmediateAdd(I
, true);
190 // And again with the current version.
191 ImmediateAdd(I
, false);
195 if ((Cache
[I
].Keep() == true ||
196 Cache
[I
].InstVerIter(Cache
) == I
.CurrentVer()) &&
197 I
.State() == pkgCache::PkgIterator::NeedsNothing
&&
198 (Cache
[I
].iFlags
& pkgDepCache::ReInstall
) != pkgDepCache::ReInstall
&&
199 (I
.Purge() != false || Cache
[I
].Mode
!= pkgDepCache::ModeDelete
||
200 (Cache
[I
].iFlags
& pkgDepCache::Purge
) != pkgDepCache::Purge
))
203 // Append it to the list
210 // PM::DepAlwaysTrue - Returns true if this dep is irrelevent /*{{{*/
211 // ---------------------------------------------------------------------
212 /* The restriction on provides is to eliminate the case when provides
213 are transitioning between valid states [ie exim to smail] */
214 bool pkgPackageManager::DepAlwaysTrue(DepIterator D
)
216 if (D
.TargetPkg()->ProvidesList
!= 0)
219 if ((Cache
[D
] & pkgDepCache::DepInstall
) != 0 &&
220 (Cache
[D
] & pkgDepCache::DepNow
) != 0)
225 // PM::CheckRConflicts - Look for reverse conflicts /*{{{*/
226 // ---------------------------------------------------------------------
227 /* This looks over the reverses for a conflicts line that needs early
229 bool pkgPackageManager::CheckRConflicts(PkgIterator Pkg
,DepIterator D
,
232 for (;D
.end() == false; D
++)
234 if (D
->Type
!= pkgCache::Dep::Conflicts
&&
235 D
->Type
!= pkgCache::Dep::Obsoletes
)
238 // The package hasnt been changed
239 if (List
->IsNow(Pkg
) == false)
242 // Ignore self conflicts, ignore conflicts from irrelevent versions
243 if (D
.ParentPkg() == Pkg
|| D
.ParentVer() != D
.ParentPkg().CurrentVer())
246 if (Cache
.VS().CheckDep(Ver
,D
->CompareOp
,D
.TargetVer()) == false)
249 if (EarlyRemove(D
.ParentPkg()) == false)
250 return _error
->Error("Reverse conflicts early remove for package '%s' failed",
256 // PM::ConfigureAll - Run the all out configuration /*{{{*/
257 // ---------------------------------------------------------------------
258 /* This configures every package. It is assumed they are all unpacked and
259 that the final configuration is valid. */
260 bool pkgPackageManager::ConfigureAll()
262 pkgOrderList
OList(&Cache
);
264 // Populate the order list
265 for (pkgOrderList::iterator I
= List
->begin(); I
!= List
->end(); I
++)
266 if (List
->IsFlag(pkgCache::PkgIterator(Cache
,*I
),
267 pkgOrderList::UnPacked
) == true)
270 if (OList
.OrderConfigure() == false)
273 std::string
const conf
= _config
->Find("PackageManager::Configure","all");
274 bool const ConfigurePkgs
= (conf
== "all");
276 // Perform the configuring
277 for (pkgOrderList::iterator I
= OList
.begin(); I
!= OList
.end(); I
++)
279 PkgIterator
Pkg(Cache
,*I
);
281 if (ConfigurePkgs
== true && VerifyAndConfigure(Pkg
,OList
) == false)
284 List
->Flag(Pkg
,pkgOrderList::Configured
,pkgOrderList::States
);
290 // PM::SmartConfigure - Perform immediate configuration of the pkg /*{{{*/
291 // ---------------------------------------------------------------------
292 /* This routine scheduals the configuration of the given package and all
293 of it's dependents. */
294 bool pkgPackageManager::SmartConfigure(PkgIterator Pkg
)
297 clog
<< "SmartConfigure " << Pkg
.Name() << endl
;
299 pkgOrderList
OList(&Cache
);
301 if (DepAdd(OList
,Pkg
) == false)
304 static std::string
const conf
= _config
->Find("PackageManager::Configure","all");
305 static bool const ConfigurePkgs
= (conf
== "all" || conf
== "smart");
307 if (ConfigurePkgs
== true)
308 if (OList
.OrderConfigure() == false)
311 // Perform the configuring
312 for (pkgOrderList::iterator I
= OList
.begin(); I
!= OList
.end(); I
++)
314 PkgIterator
Pkg(Cache
,*I
);
316 if (ConfigurePkgs
== true && VerifyAndConfigure(Pkg
,OList
) == false)
319 List
->Flag(Pkg
,pkgOrderList::Configured
,pkgOrderList::States
);
322 if (Cache
[Pkg
].InstVerIter(Cache
)->MultiArch
== pkgCache::Version::Same
)
323 for (PkgIterator P
= Pkg
.Group().PackageList();
324 P
.end() == false; P
= Pkg
.Group().NextPkg(P
))
326 if (Pkg
== P
|| List
->IsFlag(P
,pkgOrderList::Configured
) == true ||
327 Cache
[P
].InstallVer
== 0 || (P
.CurrentVer() == Cache
[P
].InstallVer
&&
328 (Cache
[Pkg
].iFlags
& pkgDepCache::ReInstall
) != pkgDepCache::ReInstall
))
334 if (List
->IsFlag(Pkg
,pkgOrderList::Configured
) == false)
335 return _error
->Error(_("Could not perform immediate configuration on '%s'. "
336 "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg
.Name(),1);
341 // PM::VerifyConfigure - Check configuration of dependancies /*{{{*/
342 // ---------------------------------------------------------------------
343 /* This routine checks that all a packages dependancies have been
344 configured, before it is going to be configured. If this gives a warning
345 on a virtual package, it means that the package thats providing it is not
347 bool pkgPackageManager::VerifyConfigure(PkgIterator Pkg
, pkgOrderList
&OList
)
349 // If this is true at the end, then the package should not be configured
351 // This holds the the OR status of the previous dependancy
352 bool previousOr
=false;
354 // First iterate through the dependancies of Pkg
355 for (DepIterator D
= Cache
[Pkg
].InstVerIter(Cache
).DependsList(); D
.end() == false; D
++)
358 /* If the dependancy is of type Depends or PreDepends, we need to check it, but only if it is going to be
359 configured at some point */
360 if (D
->Type
== pkgCache::Dep::Depends
|| D
->Type
== pkgCache::Dep::PreDepends
) {
362 /* If the previous package and this package are OR dependancies, and the previous package satisfied the dependancy
363 then skip this dependancy as it is not relevent, this will repeat for the next package if the situation is the
365 if (previousOr
&& !error
) { // As error has not been reset, this refers to the previous dependancy
366 previousOr
= (D
->CompareOp
& pkgCache::Dep::Or
) == pkgCache::Dep::Or
;
373 // Check thorugh all possible versions of this dependancy (D)
374 SPtrArray
<Version
*> VList
= D
.AllTargets();
375 for (Version
**I
= VList
; *I
!= 0; I
++)
377 VerIterator
DepVer(Cache
,*I
);
378 PkgIterator DepPkg
= DepVer
.ParentPkg();
379 VerIterator
DepInstallVer(Cache
,Cache
[DepPkg
].InstallVer
);
381 if (DepPkg
.CurrentVer() == DepVer
&& !List
->IsFlag(DepPkg
,pkgOrderList::UnPacked
)) {
386 if (Cache
[DepPkg
].InstallVer
== DepVer
&&
387 (List
->IsFlag(DepPkg
,pkgOrderList::Configured
) || OList
.IsFlag(DepPkg
,pkgOrderList::InList
))) {
393 /* Only worry here if this package is a OR with the next, as even though this package does not satisfy the OR
394 the next one might */
395 if (error
&& !((D
->CompareOp
& pkgCache::Dep::Or
) == pkgCache::Dep::Or
)) {
396 _error
->Error("Package %s should not be configured because package %s is not configured",Pkg
.Name(),D
.TargetPkg().Name());
398 /* If the previous package is a OR but not this package, but there is still an error then fail as it will not
400 } else if (error
&& previousOr
&& !((D
->CompareOp
& pkgCache::Dep::Or
) == pkgCache::Dep::Or
)) {
401 _error
->Error("Package %s should not be configured because package %s (or any alternatives) are not configured",Pkg
.Name(),D
.TargetPkg().Name());
405 previousOr
= (D
->CompareOp
& pkgCache::Dep::Or
) == pkgCache::Dep::Or
;
413 // PM::VerifyAndConfigure - Check configuration of dependancies /*{{{*/
414 // ---------------------------------------------------------------------
415 /* This routine verifies if a package can be configured and if so
417 bool pkgPackageManager::VerifyAndConfigure(PkgIterator Pkg
, pkgOrderList
&OList
)
419 if (VerifyConfigure(Pkg
, OList
))
420 return Configure(Pkg
);
426 // PM::DepAdd - Add all dependents to the oder list /*{{{*/
427 // ---------------------------------------------------------------------
428 /* This recursively adds all dependents to the order list */
429 bool pkgPackageManager::DepAdd(pkgOrderList
&OList
,PkgIterator Pkg
,int Depth
)
431 if (OList
.IsFlag(Pkg
,pkgOrderList::Added
) == true)
433 if (List
->IsFlag(Pkg
,pkgOrderList::Configured
) == true)
435 if (List
->IsFlag(Pkg
,pkgOrderList::UnPacked
) == false)
439 std::clog
<< OutputInDepth(Depth
) << "DepAdd: " << Pkg
.Name() << std::endl
;
441 // Put the package on the list
442 OList
.push_back(Pkg
);
443 OList
.Flag(Pkg
,pkgOrderList::Added
);
446 // Check the dependencies to see if they are all satisfied.
448 for (DepIterator D
= Cache
[Pkg
].InstVerIter(Cache
).DependsList(); D
.end() == false;)
450 if (D
->Type
!= pkgCache::Dep::Depends
&& D
->Type
!= pkgCache::Dep::PreDepends
)
458 for (bool LastOR
= true; D
.end() == false && LastOR
== true; D
++)
460 LastOR
= (D
->CompareOp
& pkgCache::Dep::Or
) == pkgCache::Dep::Or
;
465 SPtrArray
<Version
*> VList
= D
.AllTargets();
466 for (Version
**I
= VList
; *I
!= 0 && Bad
== true; I
++)
468 VerIterator
Ver(Cache
,*I
);
469 PkgIterator Pkg
= Ver
.ParentPkg();
471 // See if the current version is ok
472 if (Pkg
.CurrentVer() == Ver
&& List
->IsNow(Pkg
) == true &&
473 Pkg
.State() == PkgIterator::NeedsNothing
)
479 // Not the install version
480 if (Cache
[Pkg
].InstallVer
!= *I
||
481 (Cache
[Pkg
].Keep() == true && Pkg
.State() == PkgIterator::NeedsNothing
&&
482 (Cache
[Pkg
].iFlags
& pkgDepCache::ReInstall
) != pkgDepCache::ReInstall
))
485 if (List
->IsFlag(Pkg
,pkgOrderList::UnPacked
) == true)
486 Bad
= !DepAdd(OList
,Pkg
,Depth
);
487 if (List
->IsFlag(Pkg
,pkgOrderList::Configured
) == true)
495 std::clog
<< OutputInDepth(Depth
) << "DepAdd FAILS on: " << Pkg
.Name() << std::endl
;
496 OList
.Flag(Pkg
,0,pkgOrderList::Added
);
507 // PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
508 // ---------------------------------------------------------------------
509 /* This is called to deal with conflicts arising from unpacking */
510 bool pkgPackageManager::EarlyRemove(PkgIterator Pkg
)
512 if (List
->IsNow(Pkg
) == false)
515 // Already removed it
516 if (List
->IsFlag(Pkg
,pkgOrderList::Removed
) == true)
519 // Woops, it will not be re-installed!
520 if (List
->IsFlag(Pkg
,pkgOrderList::InList
) == false)
523 // Essential packages get special treatment
524 bool IsEssential
= false;
525 if ((Pkg
->Flags
& pkgCache::Flag::Essential
) != 0)
528 /* Check for packages that are the dependents of essential packages and
530 if (Pkg
->CurrentVer
!= 0)
532 for (DepIterator D
= Pkg
.RevDependsList(); D
.end() == false &&
533 IsEssential
== false; D
++)
534 if (D
->Type
== pkgCache::Dep::Depends
|| D
->Type
== pkgCache::Dep::PreDepends
)
535 if ((D
.ParentPkg()->Flags
& pkgCache::Flag::Essential
) != 0)
539 if (IsEssential
== true)
541 if (_config
->FindB("APT::Force-LoopBreak",false) == false)
542 return _error
->Error(_("This installation run will require temporarily "
543 "removing the essential package %s due to a "
544 "Conflicts/Pre-Depends loop. This is often bad, "
545 "but if you really want to do it, activate the "
546 "APT::Force-LoopBreak option."),Pkg
.Name());
549 bool Res
= SmartRemove(Pkg
);
550 if (Cache
[Pkg
].Delete() == false)
551 List
->Flag(Pkg
,pkgOrderList::Removed
,pkgOrderList::States
);
556 // PM::SmartRemove - Removal Helper /*{{{*/
557 // ---------------------------------------------------------------------
559 bool pkgPackageManager::SmartRemove(PkgIterator Pkg
)
561 if (List
->IsNow(Pkg
) == false)
564 List
->Flag(Pkg
,pkgOrderList::Configured
,pkgOrderList::States
);
566 return Remove(Pkg
,(Cache
[Pkg
].iFlags
& pkgDepCache::Purge
) == pkgDepCache::Purge
);
570 // PM::SmartUnPack - Install helper /*{{{*/
571 // ---------------------------------------------------------------------
572 /* This performs the task of handling pre-depends. */
573 bool pkgPackageManager::SmartUnPack(PkgIterator Pkg
)
575 return SmartUnPack(Pkg
, true);
577 bool pkgPackageManager::SmartUnPack(PkgIterator Pkg
, bool const Immediate
)
580 clog
<< "SmartUnPack " << Pkg
.Name() << endl
;
582 // Check if it is already unpacked
583 if (Pkg
.State() == pkgCache::PkgIterator::NeedsConfigure
&&
584 Cache
[Pkg
].Keep() == true)
586 List
->Flag(Pkg
,pkgOrderList::UnPacked
,pkgOrderList::States
);
587 if (Immediate
== true &&
588 List
->IsFlag(Pkg
,pkgOrderList::Immediate
) == true)
589 if (SmartConfigure(Pkg
) == false)
590 return _error
->Error(_("Could not perform immediate configuration on already unpacked '%s'. "
591 "Please see man 5 apt.conf under APT::Immediate-Configure for details."),Pkg
.Name());
595 VerIterator
const instVer
= Cache
[Pkg
].InstVerIter(Cache
);
597 /* See if this packages install version has any predependencies
598 that are not met by 'now' packages. */
599 for (DepIterator D
= instVer
.DependsList();
602 // Compute a single dependency element (glob or)
603 pkgCache::DepIterator Start
;
604 pkgCache::DepIterator End
;
607 while (End
->Type
== pkgCache::Dep::PreDepends
)
610 clog
<< "PreDepends order for " << Pkg
.Name() << std::endl
;
612 // Look for possible ok targets.
613 SPtrArray
<Version
*> VList
= Start
.AllTargets();
615 for (Version
**I
= VList
; *I
!= 0 && Bad
== true; I
++)
617 VerIterator
Ver(Cache
,*I
);
618 PkgIterator Pkg
= Ver
.ParentPkg();
620 // See if the current version is ok
621 if (Pkg
.CurrentVer() == Ver
&& List
->IsNow(Pkg
) == true &&
622 Pkg
.State() == PkgIterator::NeedsNothing
)
626 clog
<< "Found ok package " << Pkg
.Name() << endl
;
631 // Look for something that could be configured.
632 for (Version
**I
= VList
; *I
!= 0 && Bad
== true; I
++)
634 VerIterator
Ver(Cache
,*I
);
635 PkgIterator Pkg
= Ver
.ParentPkg();
637 // Not the install version
638 if (Cache
[Pkg
].InstallVer
!= *I
||
639 (Cache
[Pkg
].Keep() == true && Pkg
.State() == PkgIterator::NeedsNothing
))
643 clog
<< "Trying to SmartConfigure " << Pkg
.Name() << endl
;
644 Bad
= !SmartConfigure(Pkg
);
647 /* If this or element did not match then continue on to the
648 next or element until a matching element is found */
651 // This triggers if someone make a pre-depends/depend loop.
653 return _error
->Error("Couldn't configure pre-depend %s for %s, "
654 "probably a dependency cycle.",
655 End
.TargetPkg().Name(),Pkg
.Name());
662 if (End
->Type
== pkgCache::Dep::Conflicts
||
663 End
->Type
== pkgCache::Dep::Obsoletes
)
665 /* Look for conflicts. Two packages that are both in the install
666 state cannot conflict so we don't check.. */
667 SPtrArray
<Version
*> VList
= End
.AllTargets();
668 for (Version
**I
= VList
; *I
!= 0; I
++)
670 VerIterator
Ver(Cache
,*I
);
671 PkgIterator Pkg
= Ver
.ParentPkg();
673 // See if the current version is conflicting
674 if (Pkg
.CurrentVer() == Ver
&& List
->IsNow(Pkg
) == true)
676 if (EarlyRemove(Pkg
) == false)
677 return _error
->Error("Internal Error, Could not early remove %s",Pkg
.Name());
683 if (End
->Type
== pkgCache::Dep::DpkgBreaks
) {
684 SPtrArray
<Version
*> VList
= End
.AllTargets();
685 for (Version
**I
= VList
; *I
!= 0; I
++)
687 VerIterator
Ver(Cache
,*I
);
688 PkgIterator BrokenPkg
= Ver
.ParentPkg();
689 // Check if it needs to be unpacked
690 if (List
->IsFlag(BrokenPkg
,pkgOrderList::InList
) && Cache
[BrokenPkg
].Delete() == false &&
691 !List
->IsFlag(BrokenPkg
,pkgOrderList::UnPacked
)) {
692 /* FIXME Setting the flag here prevents breakage loops, that can occur if BrokenPkg (or one of the
693 packages it breaks) breaks Pkg */
694 List
->Flag(Pkg
,pkgOrderList::UnPacked
,pkgOrderList::States
);
695 // Found a break, so unpack the package
696 SmartUnPack(BrokenPkg
, false);
702 // Check for reverse conflicts.
703 if (CheckRConflicts(Pkg
,Pkg
.RevDependsList(),
704 instVer
.VerStr()) == false)
707 for (PrvIterator P
= instVer
.ProvidesList();
708 P
.end() == false; P
++)
709 CheckRConflicts(Pkg
,P
.ParentPkg().RevDependsList(),P
.ProvideVersion());
711 List
->Flag(Pkg
,pkgOrderList::UnPacked
,pkgOrderList::States
);
713 if (instVer
->MultiArch
== pkgCache::Version::Same
)
714 for (PkgIterator P
= Pkg
.Group().PackageList();
715 P
.end() == false; P
= Pkg
.Group().NextPkg(P
))
717 if (Pkg
== P
|| List
->IsFlag(P
,pkgOrderList::UnPacked
) == true ||
718 Cache
[P
].InstallVer
== 0 || (P
.CurrentVer() == Cache
[P
].InstallVer
&&
719 (Cache
[Pkg
].iFlags
& pkgDepCache::ReInstall
) != pkgDepCache::ReInstall
))
721 SmartUnPack(P
, false);
724 if(Install(Pkg
,FileNames
[Pkg
->ID
]) == false)
727 // Perform immedate configuration of the package.
728 if (Immediate
== true &&
729 List
->IsFlag(Pkg
,pkgOrderList::Immediate
) == true)
730 if (SmartConfigure(Pkg
) == false)
731 return _error
->Error(_("Could not perform immediate configuration on '%s'. "
732 "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg
.Name(),2);
737 // PM::OrderInstall - Installation ordering routine /*{{{*/
738 // ---------------------------------------------------------------------
740 pkgPackageManager::OrderResult
pkgPackageManager::OrderInstall()
742 if (CreateOrderList() == false)
748 clog
<< "Beginning to order" << endl
;
750 bool const ordering
=
751 _config
->FindB("PackageManager::UnpackAll",true) ?
752 List
->OrderUnpack(FileNames
) : List
->OrderCritical();
753 if (ordering
== false)
755 _error
->Error("Internal ordering error");
760 clog
<< "Done ordering" << endl
;
762 bool DoneSomething
= false;
763 for (pkgOrderList::iterator I
= List
->begin(); I
!= List
->end(); I
++)
765 PkgIterator
Pkg(Cache
,*I
);
767 if (List
->IsNow(Pkg
) == false)
770 clog
<< "Skipping already done " << Pkg
.Name() << endl
;
774 if (List
->IsMissing(Pkg
) == true)
777 clog
<< "Sequence completed at " << Pkg
.Name() << endl
;
778 if (DoneSomething
== false)
780 _error
->Error("Internal Error, ordering was unable to handle the media swap");
787 if (Cache
[Pkg
].Keep() == true &&
788 Pkg
.State() == pkgCache::PkgIterator::NeedsNothing
&&
789 (Cache
[Pkg
].iFlags
& pkgDepCache::ReInstall
) != pkgDepCache::ReInstall
)
791 _error
->Error("Internal Error, trying to manipulate a kept package (%s)",Pkg
.Name());
795 // Perform a delete or an install
796 if (Cache
[Pkg
].Delete() == true)
798 if (SmartRemove(Pkg
) == false)
802 if (SmartUnPack(Pkg
) == false)
804 DoneSomething
= true;
807 // Final run through the configure phase
808 if (ConfigureAll() == false)
812 for (pkgOrderList::iterator I
= List
->begin(); I
!= List
->end(); I
++)
814 if (List
->IsFlag(*I
,pkgOrderList::Configured
) == false)
816 _error
->Error("Internal error, packages left unconfigured. %s",
817 PkgIterator(Cache
,*I
).Name());
825 // PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
826 // ---------------------------------------------------------------------
827 pkgPackageManager::OrderResult
828 pkgPackageManager::DoInstallPostFork(int statusFd
)
831 // FIXME: use SetCloseExec here once it taught about throwing
832 // exceptions instead of doing _exit(100) on failure
833 fcntl(statusFd
,F_SETFD
,FD_CLOEXEC
);
834 bool goResult
= Go(statusFd
);
835 if(goResult
== false)
841 // PM::DoInstall - Does the installation /*{{{*/
842 // ---------------------------------------------------------------------
843 /* This uses the filenames in FileNames and the information in the
844 DepCache to perform the installation of packages.*/
845 pkgPackageManager::OrderResult
pkgPackageManager::DoInstall(int statusFd
)
847 if(DoInstallPreFork() == Failed
)
850 return DoInstallPostFork(statusFd
);