]> git.saurik.com Git - apt.git/blame - apt-pkg/packagemanager.cc
Merge branch 'debian/sid' into debian/experimental
[apt.git] / apt-pkg / packagemanager.cc
CommitLineData
6c139d6e
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
b9c0654c 3// $Id: packagemanager.cc,v 1.30 2003/04/27 03:04:15 doogie Exp $
6c139d6e
AL
4/* ######################################################################
5
6 Package Manager - Abstacts the package manager
7
8 More work is needed in the area of transitioning provides, ie exim
9 replacing smail. This can cause interesing side effects.
10
11 Other cases involving conflicts+replaces should be tested.
12
13 ##################################################################### */
14 /*}}}*/
15// Include Files /*{{{*/
453b82a3 16#include <config.h>
ea542140 17
094a497d
AL
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>
03e39e59 23#include <apt-pkg/acquire-item.h>
30e1eab5
AL
24#include <apt-pkg/algorithms.h>
25#include <apt-pkg/configuration.h>
b2e465d6 26#include <apt-pkg/sptr.h>
453b82a3
DK
27#include <apt-pkg/macros.h>
28#include <apt-pkg/pkgcache.h>
29#include <apt-pkg/cacheiterators.h>
30#include <apt-pkg/strutl.h>
b58f28d4 31#include <apt-pkg/install-progress.h>
453b82a3
DK
32
33#include <stddef.h>
34#include <list>
35#include <string>
5819a761 36#include <iostream>
a00a9b44
DK
37
38#include <apti18n.h>
92fcbfc1 39 /*}}}*/
5819a761
AL
40using namespace std;
41
590f1923
CB
42bool pkgPackageManager::SigINTStop = false;
43
6c139d6e
AL
44// PM::PackageManager - Constructor /*{{{*/
45// ---------------------------------------------------------------------
46/* */
dcaa1185
DK
47pkgPackageManager::pkgPackageManager(pkgDepCache *pCache) : Cache(*pCache),
48 List(NULL), Res(Incomplete)
6c139d6e
AL
49{
50 FileNames = new string[Cache.Head().PackageCount];
30e1eab5 51 Debug = _config->FindB("Debug::pkgPackageManager",false);
dcaa1185
DK
52 NoImmConfigure = !_config->FindB("APT::Immediate-Configure",true);
53 ImmConfigureAll = _config->FindB("APT::Immediate-Configure-All",false);
6c139d6e
AL
54}
55 /*}}}*/
56// PM::PackageManager - Destructor /*{{{*/
57// ---------------------------------------------------------------------
58/* */
59pkgPackageManager::~pkgPackageManager()
60{
61 delete List;
62 delete [] FileNames;
63}
64 /*}}}*/
03e39e59
AL
65// PM::GetArchives - Queue the archives for download /*{{{*/
66// ---------------------------------------------------------------------
67/* */
68bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
69 pkgRecords *Recs)
70{
7a1b1f8b
AL
71 if (CreateOrderList() == false)
72 return false;
73
5e312de7
DK
74 bool const ordering =
75 _config->FindB("PackageManager::UnpackAll",true) ?
76 List->OrderUnpack() : List->OrderCritical();
77 if (ordering == false)
7a1b1f8b
AL
78 return _error->Error("Internal ordering error");
79
91c03d37 80 for (pkgOrderList::iterator I = List->begin(); I != List->end(); ++I)
7a1b1f8b
AL
81 {
82 PkgIterator Pkg(Cache,*I);
281daf46
AL
83 FileNames[Pkg->ID] = string();
84
7a1b1f8b
AL
85 // Skip packages to erase
86 if (Cache[Pkg].Delete() == true)
03e39e59 87 continue;
d38b7b3d
AL
88
89 // Skip Packages that need configure only.
9dbb421f
AL
90 if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure &&
91 Cache[Pkg].Keep() == true)
d38b7b3d 92 continue;
281daf46
AL
93
94 // Skip already processed packages
95 if (List->IsNow(Pkg) == false)
96 continue;
803ea2a8 97
7a1b1f8b
AL
98 new pkgAcqArchive(Owner,Sources,Recs,Cache[Pkg].InstVerIter(Cache),
99 FileNames[Pkg->ID]);
03e39e59 100 }
7a1b1f8b 101
03e39e59
AL
102 return true;
103}
104 /*}}}*/
6c139d6e
AL
105// PM::FixMissing - Keep all missing packages /*{{{*/
106// ---------------------------------------------------------------------
107/* This is called to correct the installation when packages could not
108 be downloaded. */
109bool pkgPackageManager::FixMissing()
bdae53f1 110{
e6756cde 111 pkgDepCache::ActionGroup group(Cache);
b2e465d6 112 pkgProblemResolver Resolve(&Cache);
2fd65468 113 List->SetFileList(FileNames);
e6756cde 114
9dbb421f 115 bool Bad = false;
f7f0d6c7 116 for (PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
6c139d6e 117 {
2fd65468 118 if (List->IsMissing(I) == false)
9dbb421f 119 continue;
2fd65468 120
9dbb421f
AL
121 // Okay, this file is missing and we need it. Mark it for keep
122 Bad = true;
74a05226 123 Cache.MarkKeep(I, false, false);
6c139d6e 124 }
bdae53f1
AL
125
126 // We have to empty the list otherwise it will not have the new changes
127 delete List;
128 List = 0;
6c139d6e 129
9dbb421f
AL
130 if (Bad == false)
131 return true;
132
6c139d6e 133 // Now downgrade everything that is broken
30e1eab5 134 return Resolve.ResolveByKeep() == true && Cache.BrokenCount() == 0;
6c139d6e
AL
135}
136 /*}}}*/
3a6d37fd
MV
137// PM::ImmediateAdd - Add the immediate flag recursivly /*{{{*/
138// ---------------------------------------------------------------------
139/* This adds the immediate flag to the pkg and recursively to the
140 dependendies
141 */
d183f850 142void pkgPackageManager::ImmediateAdd(PkgIterator I, bool UseInstallVer, unsigned const int &Depth)
3a6d37fd
MV
143{
144 DepIterator D;
145
146 if(UseInstallVer)
147 {
148 if(Cache[I].InstallVer == 0)
149 return;
150 D = Cache[I].InstVerIter(Cache).DependsList();
151 } else {
152 if (I->CurrentVer == 0)
153 return;
154 D = I.CurrentVer().DependsList();
155 }
156
f7f0d6c7 157 for ( /* nothing */ ; D.end() == false; ++D)
3a6d37fd
MV
158 if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
159 {
160 if(!List->IsFlag(D.TargetPkg(), pkgOrderList::Immediate))
161 {
162 if(Debug)
90436124 163 clog << OutputInDepth(Depth) << "ImmediateAdd(): Adding Immediate flag to " << D.TargetPkg() << " cause of " << D.DepType() << " " << I.FullName() << endl;
3a6d37fd 164 List->Flag(D.TargetPkg(),pkgOrderList::Immediate);
d183f850 165 ImmediateAdd(D.TargetPkg(), UseInstallVer, Depth + 1);
3a6d37fd
MV
166 }
167 }
168 return;
169}
170 /*}}}*/
7a1b1f8b
AL
171// PM::CreateOrderList - Create the ordering class /*{{{*/
172// ---------------------------------------------------------------------
173/* This populates the ordering list with all the packages that are
174 going to change. */
175bool pkgPackageManager::CreateOrderList()
176{
281daf46
AL
177 if (List != 0)
178 return true;
179
7a1b1f8b 180 delete List;
b2e465d6 181 List = new pkgOrderList(&Cache);
dcaa1185 182
a6c8798a
CB
183 if (Debug && ImmConfigureAll)
184 clog << "CreateOrderList(): Adding Immediate flag for all packages because of APT::Immediate-Configure-All" << endl;
079cc404 185
7a1b1f8b 186 // Generate the list of affected packages and sort it
f7f0d6c7 187 for (PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
7a1b1f8b 188 {
e7b470ee
AL
189 // Ignore no-version packages
190 if (I->VersionList == 0)
191 continue;
192
138d4b3d 193 // Mark the package and its dependends for immediate configuration
fb805d80 194 if ((((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) &&
a6c8798a 195 NoImmConfigure == false) || ImmConfigureAll)
7a1b1f8b 196 {
a6c8798a 197 if(Debug && !ImmConfigureAll)
90436124 198 clog << "CreateOrderList(): Adding Immediate flag for " << I.FullName() << endl;
7a1b1f8b 199 List->Flag(I,pkgOrderList::Immediate);
d38b7b3d 200
a6c8798a 201 if (!ImmConfigureAll) {
a6c8798a
CB
202 // Look for other install packages to make immediate configurea
203 ImmediateAdd(I, true);
e2a5ff0c 204
a6c8798a
CB
205 // And again with the current version.
206 ImmediateAdd(I, false);
207 }
7a1b1f8b
AL
208 }
209
210 // Not interesting
211 if ((Cache[I].Keep() == true ||
212 Cache[I].InstVerIter(Cache) == I.CurrentVer()) &&
d556d1a1 213 I.State() == pkgCache::PkgIterator::NeedsNothing &&
d0c59649 214 (Cache[I].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall &&
d556d1a1
AL
215 (I.Purge() != false || Cache[I].Mode != pkgDepCache::ModeDelete ||
216 (Cache[I].iFlags & pkgDepCache::Purge) != pkgDepCache::Purge))
7a1b1f8b
AL
217 continue;
218
219 // Append it to the list
138d4b3d 220 List->push_back(I);
7a1b1f8b
AL
221 }
222
223 return true;
224}
225 /*}}}*/
1e3f4083 226// PM::DepAlwaysTrue - Returns true if this dep is irrelevant /*{{{*/
6c139d6e
AL
227// ---------------------------------------------------------------------
228/* The restriction on provides is to eliminate the case when provides
229 are transitioning between valid states [ie exim to smail] */
230bool pkgPackageManager::DepAlwaysTrue(DepIterator D)
231{
232 if (D.TargetPkg()->ProvidesList != 0)
233 return false;
234
235 if ((Cache[D] & pkgDepCache::DepInstall) != 0 &&
236 (Cache[D] & pkgDepCache::DepNow) != 0)
237 return true;
238 return false;
239}
240 /*}}}*/
241// PM::CheckRConflicts - Look for reverse conflicts /*{{{*/
242// ---------------------------------------------------------------------
243/* This looks over the reverses for a conflicts line that needs early
244 removal. */
245bool pkgPackageManager::CheckRConflicts(PkgIterator Pkg,DepIterator D,
246 const char *Ver)
247{
f7f0d6c7 248 for (;D.end() == false; ++D)
6c139d6e 249 {
b2e465d6
AL
250 if (D->Type != pkgCache::Dep::Conflicts &&
251 D->Type != pkgCache::Dep::Obsoletes)
6c139d6e 252 continue;
5af32db6 253
1e3f4083 254 // The package hasn't been changed
5af32db6
AL
255 if (List->IsNow(Pkg) == false)
256 continue;
6c139d6e 257
1e3f4083 258 // Ignore self conflicts, ignore conflicts from irrelevant versions
85434114 259 if (D.IsIgnorable(Pkg) || D.ParentVer() != D.ParentPkg().CurrentVer())
6c139d6e
AL
260 continue;
261
b2e465d6 262 if (Cache.VS().CheckDep(Ver,D->CompareOp,D.TargetVer()) == false)
6c139d6e 263 continue;
b2e465d6 264
0eb4af9d 265 if (EarlyRemove(D.ParentPkg(), &D) == false)
5af32db6 266 return _error->Error("Reverse conflicts early remove for package '%s' failed",
90436124 267 Pkg.FullName().c_str());
5af32db6 268 }
6c139d6e
AL
269 return true;
270}
271 /*}}}*/
272// PM::ConfigureAll - Run the all out configuration /*{{{*/
273// ---------------------------------------------------------------------
274/* This configures every package. It is assumed they are all unpacked and
590f1923
CB
275 that the final configuration is valid. This is also used to catch packages
276 that have not been configured when using ImmConfigureAll */
6c139d6e
AL
277bool pkgPackageManager::ConfigureAll()
278{
b2e465d6 279 pkgOrderList OList(&Cache);
6c139d6e
AL
280
281 // Populate the order list
91c03d37 282 for (pkgOrderList::iterator I = List->begin(); I != List->end(); ++I)
6c139d6e
AL
283 if (List->IsFlag(pkgCache::PkgIterator(Cache,*I),
284 pkgOrderList::UnPacked) == true)
285 OList.push_back(*I);
286
287 if (OList.OrderConfigure() == false)
288 return false;
5e312de7
DK
289
290 std::string const conf = _config->Find("PackageManager::Configure","all");
291 bool const ConfigurePkgs = (conf == "all");
292
6c139d6e 293 // Perform the configuring
91c03d37 294 for (pkgOrderList::iterator I = OList.begin(); I != OList.end(); ++I)
6c139d6e
AL
295 {
296 PkgIterator Pkg(Cache,*I);
17182c0c
CB
297
298 /* Check if the package has been configured, this can happen if SmartConfigure
299 calls its self */
300 if (List->IsFlag(Pkg,pkgOrderList::Configured)) continue;
803ea2a8 301
d41d0e01 302 if (ConfigurePkgs == true && SmartConfigure(Pkg, 0) == false) {
c7c7d3e8
CB
303 if (ImmConfigureAll)
304 _error->Error(_("Could not perform immediate configuration on '%s'. "
90436124 305 "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.FullName().c_str(),1);
c7c7d3e8 306 else
90436124 307 _error->Error("Internal error, packages left unconfigured. %s",Pkg.FullName().c_str());
6c139d6e 308 return false;
634985f8 309 }
6c139d6e
AL
310
311 List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
312 }
313
314 return true;
315}
316 /*}}}*/
0eb4af9d
DK
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 */
321bool 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)
324{
325 if (PkgLoop == false)
326 List->Flag(Pkg,pkgOrderList::Loop);
327 bool success = false;
328 switch(action)
329 {
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;
333 }
334 if (PkgLoop == false)
335 List->RmFlag(Pkg,pkgOrderList::Loop);
336
337 if (success == false)
338 return false;
339
340 if (Bad != NULL)
341 *Bad = false;
342 if (Changed != NULL && List->IsFlag(DepPkg,pkgOrderList::Loop) == false)
343 *Changed = true;
344 return true;
345}
346 /*}}}*/
6c139d6e
AL
347// PM::SmartConfigure - Perform immediate configuration of the pkg /*{{{*/
348// ---------------------------------------------------------------------
c7c7d3e8 349/* This function tries to put the system in a state where Pkg can be configured.
0eb4af9d
DK
350 This involves checking each of Pkg's dependencies and unpacking and
351 configuring packages where needed. */
d41d0e01 352bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
6c139d6e 353{
38ff3de6 354 // If this is true, only check and correct and dependencies without the Loop flag
2dd2c801 355 bool const PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop);
d41d0e01 356
987d8d03
CB
357 if (Debug) {
358 VerIterator InstallVer = VerIterator(Cache,Cache[Pkg].InstallVer);
90436124 359 clog << OutputInDepth(Depth) << "SmartConfigure " << Pkg.FullName() << " (" << InstallVer.VerStr() << ")";
d41d0e01 360 if (PkgLoop)
38ff3de6 361 clog << " (Only Correct Dependencies)";
d41d0e01 362 clog << endl;
987d8d03 363 }
0eacf067 364
590f1923 365 VerIterator const instVer = Cache[Pkg].InstVerIter(Cache);
0eb4af9d
DK
366
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
38ff3de6 369 be the case, so check for dependencies before configuring. */
2dd2c801 370 bool Bad = false, Changed = false;
9c5104cf 371 const unsigned int max_loops = _config->FindI("APT::pkgPackageManager::MaxLoopCount", 5000);
bce4caa3 372 unsigned int i=0;
42d51f33 373 std::list<DepIterator> needConfigure;
bce4caa3
MV
374 do
375 {
2dd2c801
DK
376 Changed = false;
377 for (DepIterator D = instVer.DependsList(); D.end() == false; )
378 {
379 // Compute a single dependency element (glob or)
380 pkgCache::DepIterator Start, End;
381 D.GlobOr(Start,End);
382
383 if (End->Type != pkgCache::Dep::Depends)
384 continue;
385 Bad = true;
386
42d51f33 387 // Check for dependencies that have not been unpacked, probably due to loops.
2dd2c801
DK
388 for (DepIterator Cur = Start; true; ++Cur)
389 {
390 SPtrArray<Version *> VList = Cur.AllTargets();
391
392 for (Version **I = VList; *I != 0; ++I)
6c139d6e 393 {
2dd2c801
DK
394 VerIterator Ver(Cache,*I);
395 PkgIterator DepPkg = Ver.ParentPkg();
396
397 // Check if the current version of the package is available and will satisfy this dependency
398 if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
399 List->IsFlag(DepPkg,pkgOrderList::Removed) == false &&
400 DepPkg.State() == PkgIterator::NeedsNothing)
401 {
402 Bad = false;
403 break;
404 }
405
406 // Check if the version that is going to be installed will satisfy the dependency
42d51f33 407 if (Cache[DepPkg].InstallVer != *I || List->IsNow(DepPkg) == false)
2dd2c801
DK
408 continue;
409
42d51f33 410 if (PkgLoop == true)
2dd2c801 411 {
42d51f33
DK
412 if (Debug)
413 std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
414 Bad = false;
42d51f33
DK
415 }
416 else
417 {
418 if (Debug)
419 clog << OutputInDepth(Depth) << "Unpacking " << DepPkg.FullName() << " to avoid loop " << Cur << endl;
0eb4af9d 420 if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 421 return false;
2dd2c801 422 }
0eb4af9d 423 break;
590f1923 424 }
42d51f33
DK
425
426 if (Cur == End || Bad == false)
2dd2c801 427 break;
42d51f33 428 }
2dd2c801
DK
429
430 if (Bad == false)
431 continue;
432
42d51f33
DK
433 needConfigure.push_back(Start);
434 }
435 if (i++ > max_loops)
436 return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack (1) for %s, aborting", Pkg.FullName().c_str());
437 } while (Changed == true);
438
439 Bad = false, Changed = false, i = 0;
440 do
441 {
442 Changed = false;
6420c00e 443 for (std::list<DepIterator>::const_iterator D = needConfigure.begin(); D != needConfigure.end(); ++D)
42d51f33 444 {
6420c00e 445 // Compute a single dependency element (glob or) without modifying D
42d51f33 446 pkgCache::DepIterator Start, End;
6420c00e
DK
447 {
448 pkgCache::DepIterator Discard = *D;
449 Discard.GlobOr(Start,End);
450 }
42d51f33
DK
451
452 if (End->Type != pkgCache::Dep::Depends)
453 continue;
454 Bad = true;
455
456 // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
2dd2c801
DK
457 for (DepIterator Cur = Start; true; ++Cur)
458 {
459 SPtrArray<Version *> VList = Cur.AllTargets();
460
461 for (Version **I = VList; *I != 0; ++I)
462 {
463 VerIterator Ver(Cache,*I);
464 PkgIterator DepPkg = Ver.ParentPkg();
465
466 // Check if the version that is going to be installed will satisfy the dependency
42d51f33 467 if (Cache[DepPkg].InstallVer != *I)
2dd2c801
DK
468 continue;
469
42d51f33 470 if (List->IsFlag(DepPkg,pkgOrderList::UnPacked))
d9f6c795 471 {
42d51f33
DK
472 if (List->IsFlag(DepPkg,pkgOrderList::Loop) && PkgLoop)
473 {
474 // This dependency has already been dealt with by another SmartConfigure on Pkg
475 Bad = false;
476 break;
477 }
0eb4af9d
DK
478 if (Debug)
479 std::clog << OutputInDepth(Depth) << "Configure already unpacked " << DepPkg << std::endl;
480 if (NonLoopingSmart(CONFIGURE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 481 return false;
71e7a0f3 482 break;
0eb4af9d 483
d9f6c795 484 }
42d51f33
DK
485 else if (List->IsFlag(DepPkg,pkgOrderList::Configured))
486 {
487 Bad = false;
488 break;
489 }
590f1923 490 }
42d51f33 491 if (Cur == End || Bad == false)
2dd2c801 492 break;
42d51f33
DK
493 }
494
495
2dd2c801 496 if (Bad == true && Changed == false && Debug == true)
6420c00e 497 std::clog << OutputInDepth(Depth) << "Could not satisfy " << *D << std::endl;
6c139d6e 498 }
bce4caa3 499 if (i++ > max_loops)
42d51f33 500 return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack (2) for %s, aborting", Pkg.FullName().c_str());
2dd2c801 501 } while (Changed == true);
0eb4af9d 502
71e7a0f3
DK
503 if (Bad == true)
504 return _error->Error(_("Could not configure '%s'. "),Pkg.FullName().c_str());
0eb4af9d 505
a99d02a8 506 if (PkgLoop) return true;
5e312de7
DK
507
508 static std::string const conf = _config->Find("PackageManager::Configure","all");
509 static bool const ConfigurePkgs = (conf == "all" || conf == "smart");
510
0eb4af9d 511 if (List->IsFlag(Pkg,pkgOrderList::Configured))
90436124 512 return _error->Error("Internal configure error on '%s'.", Pkg.FullName().c_str());
5e312de7 513
590f1923
CB
514 if (ConfigurePkgs == true && Configure(Pkg) == false)
515 return false;
75a90b93 516
590f1923 517 List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
6c139d6e 518
894d672e 519 if ((Cache[Pkg].InstVerIter(Cache)->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
d77b985a
DK
520 for (PkgIterator P = Pkg.Group().PackageList();
521 P.end() == false; P = Pkg.Group().NextPkg(P))
522 {
523 if (Pkg == P || List->IsFlag(P,pkgOrderList::Configured) == true ||
2b8b1e7a 524 List->IsFlag(P,pkgOrderList::UnPacked) == false ||
d77b985a
DK
525 Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
526 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
527 continue;
71e7a0f3
DK
528 if (SmartConfigure(P, (Depth +1)) == false)
529 return false;
d77b985a
DK
530 }
531
6c139d6e
AL
532 // Sanity Check
533 if (List->IsFlag(Pkg,pkgOrderList::Configured) == false)
90436124 534 return _error->Error(_("Could not configure '%s'. "),Pkg.FullName().c_str());
20382bad 535
6c139d6e
AL
536 return true;
537}
538 /*}}}*/
6c139d6e
AL
539// PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
540// ---------------------------------------------------------------------
541/* This is called to deal with conflicts arising from unpacking */
542bool pkgPackageManager::EarlyRemove(PkgIterator Pkg)
0eb4af9d
DK
543{
544 return EarlyRemove(Pkg, NULL);
545}
546bool pkgPackageManager::EarlyRemove(PkgIterator Pkg, DepIterator const * const Dep)
6c139d6e
AL
547{
548 if (List->IsNow(Pkg) == false)
549 return true;
0eb4af9d 550
6c139d6e
AL
551 // Already removed it
552 if (List->IsFlag(Pkg,pkgOrderList::Removed) == true)
553 return true;
0eb4af9d 554
6c139d6e
AL
555 // Woops, it will not be re-installed!
556 if (List->IsFlag(Pkg,pkgOrderList::InList) == false)
557 return false;
9d4c8f67 558
0eb4af9d
DK
559 // these breaks on M-A:same packages can be dealt with. They 'loop' by design
560 if (Dep != NULL && (*Dep)->Type == pkgCache::Dep::DpkgBreaks && Dep->IsMultiArchImplicit() == true)
561 return true;
562
9d4c8f67 563 // Essential packages get special treatment
5af32db6 564 bool IsEssential = false;
c5200869
JAK
565 if ((Pkg->Flags & pkgCache::Flag::Essential) != 0 ||
566 (Pkg->Flags & pkgCache::Flag::Important) != 0)
5af32db6
AL
567 IsEssential = true;
568
0eb4af9d 569 /* Check for packages that are the dependents of essential packages and
5af32db6
AL
570 promote them too */
571 if (Pkg->CurrentVer != 0)
572 {
0eb4af9d 573 for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() == false &&
f7f0d6c7 574 IsEssential == false; ++D)
5af32db6 575 if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
c5200869
JAK
576 if ((D.ParentPkg()->Flags & pkgCache::Flag::Essential) != 0 ||
577 (D.ParentPkg()->Flags & pkgCache::Flag::Important) != 0)
5af32db6
AL
578 IsEssential = true;
579 }
580
581 if (IsEssential == true)
9d4c8f67
AL
582 {
583 if (_config->FindB("APT::Force-LoopBreak",false) == false)
b2e465d6
AL
584 return _error->Error(_("This installation run will require temporarily "
585 "removing the essential package %s due to a "
586 "Conflicts/Pre-Depends loop. This is often bad, "
587 "but if you really want to do it, activate the "
90436124 588 "APT::Force-LoopBreak option."),Pkg.FullName().c_str());
9d4c8f67 589 }
0eb4af9d
DK
590 // dpkg will auto-deconfigure it, no need for the big remove hammer
591 else if (Dep != NULL && (*Dep)->Type == pkgCache::Dep::DpkgBreaks)
592 return true;
593
6c139d6e
AL
594 bool Res = SmartRemove(Pkg);
595 if (Cache[Pkg].Delete() == false)
596 List->Flag(Pkg,pkgOrderList::Removed,pkgOrderList::States);
0eb4af9d 597
6c139d6e
AL
598 return Res;
599}
600 /*}}}*/
601// PM::SmartRemove - Removal Helper /*{{{*/
602// ---------------------------------------------------------------------
603/* */
604bool pkgPackageManager::SmartRemove(PkgIterator Pkg)
605{
606 if (List->IsNow(Pkg) == false)
607 return true;
608
609 List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
803ea2a8 610
28166356 611 return Remove(Pkg,(Cache[Pkg].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge);
6c139d6e
AL
612}
613 /*}}}*/
614// PM::SmartUnPack - Install helper /*{{{*/
615// ---------------------------------------------------------------------
1e3f4083 616/* This puts the system in a state where it can Unpack Pkg, if Pkg is already
590f1923 617 unpacked, or when it has been unpacked, if Immediate==true it configures it. */
6c139d6e 618bool pkgPackageManager::SmartUnPack(PkgIterator Pkg)
d77b985a 619{
d41d0e01 620 return SmartUnPack(Pkg, true, 0);
d77b985a 621}
d41d0e01 622bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int const Depth)
6c139d6e 623{
d41d0e01
CB
624 bool PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop);
625
987d8d03 626 if (Debug) {
90436124 627 clog << OutputInDepth(Depth) << "SmartUnPack " << Pkg.FullName();
987d8d03
CB
628 VerIterator InstallVer = VerIterator(Cache,Cache[Pkg].InstallVer);
629 if (Pkg.CurrentVer() == 0)
c4f931f8 630 clog << " (install version " << InstallVer.VerStr() << ")";
987d8d03 631 else
c4f931f8 632 clog << " (replace version " << Pkg.CurrentVer().VerStr() << " with " << InstallVer.VerStr() << ")";
d41d0e01 633 if (PkgLoop)
c4f931f8 634 clog << " (Only Perform PreUnpack Checks)";
0caa5a4c
DK
635 if (Immediate)
636 clog << " immediately";
c4f931f8 637 clog << endl;
987d8d03 638 }
cfcdf7fe 639
d77b985a
DK
640 VerIterator const instVer = Cache[Pkg].InstVerIter(Cache);
641
0eb4af9d 642 /* PreUnpack Checks: This loop checks and attempts to rectify any problems that would prevent the package being unpacked.
98ee4922 643 It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
c7c7d3e8 644 avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
0eb4af9d 645 complex dependency structures, trying to configure some packages while breaking the loops can complicate things.
98ee4922 646 This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
c7c7d3e8 647 or by the ConfigureAll call at the end of the for loop in OrderInstall. */
0eb4af9d
DK
648 bool SomethingBad = false, Changed = false;
649 bool couldBeTemporaryRemoved = Depth != 0 && List->IsFlag(Pkg,pkgOrderList::Removed) == false;
9c5104cf 650 const unsigned int max_loops = _config->FindI("APT::pkgPackageManager::MaxLoopCount", 5000);
5ab7b53b 651 unsigned int i = 0;
bce4caa3
MV
652 do
653 {
98ee4922
DK
654 Changed = false;
655 for (DepIterator D = instVer.DependsList(); D.end() == false; )
6c139d6e 656 {
98ee4922
DK
657 // Compute a single dependency element (glob or)
658 pkgCache::DepIterator Start, End;
659 D.GlobOr(Start,End);
f4945db3 660
98ee4922
DK
661 if (End->Type == pkgCache::Dep::PreDepends)
662 {
663 bool Bad = true;
664 if (Debug)
665 clog << OutputInDepth(Depth) << "PreDepends order for " << Pkg.FullName() << std::endl;
666
667 // Look for easy targets: packages that are already okay
668 for (DepIterator Cur = Start; Bad == true; ++Cur)
6c139d6e 669 {
d8e25d34 670 SPtrArray<Version *> VList = Cur.AllTargets();
98ee4922
DK
671 for (Version **I = VList; *I != 0; ++I)
672 {
673 VerIterator Ver(Cache,*I);
674 PkgIterator Pkg = Ver.ParentPkg();
675
676 // See if the current version is ok
677 if (Pkg.CurrentVer() == Ver && List->IsNow(Pkg) == true &&
678 Pkg.State() == PkgIterator::NeedsNothing)
679 {
680 Bad = false;
681 if (Debug)
682 clog << OutputInDepth(Depth) << "Found ok package " << Pkg.FullName() << endl;
683 break;
684 }
685 }
686 if (Cur == End)
687 break;
17182c0c 688 }
6c139d6e 689
98ee4922 690 // Look for something that could be configured.
275024e9 691 for (DepIterator Cur = Start; Bad == true && Cur.end() == false; ++Cur)
98ee4922 692 {
d8e25d34 693 SPtrArray<Version *> VList = Cur.AllTargets();
98ee4922
DK
694 for (Version **I = VList; *I != 0; ++I)
695 {
696 VerIterator Ver(Cache,*I);
0eb4af9d 697 PkgIterator DepPkg = Ver.ParentPkg();
1006601e 698
98ee4922 699 // Not the install version
0eb4af9d
DK
700 if (Cache[DepPkg].InstallVer != *I ||
701 (Cache[DepPkg].Keep() == true && DepPkg.State() == PkgIterator::NeedsNothing))
98ee4922
DK
702 continue;
703
0eb4af9d 704 if (List->IsFlag(DepPkg,pkgOrderList::Configured))
98ee4922
DK
705 {
706 Bad = false;
707 break;
708 }
709
710 // check if it needs unpack or if if configure is enough
0eb4af9d 711 if (List->IsFlag(DepPkg,pkgOrderList::UnPacked) == false)
98ee4922
DK
712 {
713 if (Debug)
0eb4af9d
DK
714 clog << OutputInDepth(Depth) << "Trying to SmartUnpack " << DepPkg.FullName() << endl;
715 if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 716 return false;
98ee4922
DK
717 }
718 else
719 {
720 if (Debug)
0eb4af9d
DK
721 clog << OutputInDepth(Depth) << "Trying to SmartConfigure " << DepPkg.FullName() << endl;
722 if (NonLoopingSmart(CONFIGURE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 723 return false;
98ee4922 724 }
0eb4af9d 725 break;
e2a5ff0c 726 }
6c139d6e 727 }
98ee4922
DK
728
729 if (Bad == true)
0eb4af9d 730 SomethingBad = true;
6c139d6e 731 }
98ee4922 732 else if (End->Type == pkgCache::Dep::Conflicts ||
0eb4af9d
DK
733 End->Type == pkgCache::Dep::Obsoletes ||
734 End->Type == pkgCache::Dep::DpkgBreaks)
cfcdf7fe 735 {
98ee4922 736 SPtrArray<Version *> VList = End.AllTargets();
0eb4af9d 737 for (Version **I = VList; *I != 0; ++I)
3e9ab9f0 738 {
98ee4922
DK
739 VerIterator Ver(Cache,*I);
740 PkgIterator ConflictPkg = Ver.ParentPkg();
0eb4af9d
DK
741 if (ConflictPkg.CurrentVer() != Ver)
742 {
743 if (Debug)
744 std::clog << OutputInDepth(Depth) << "Ignore not-installed version " << Ver.VerStr() << " of " << ConflictPkg.FullName() << " for " << End << std::endl;
745 continue;
746 }
3e9ab9f0 747
0eb4af9d 748 if (List->IsNow(ConflictPkg) == false)
98ee4922 749 {
2252183c 750 if (Debug)
0eb4af9d
DK
751 std::clog << OutputInDepth(Depth) << "Ignore already dealt-with version " << Ver.VerStr() << " of " << ConflictPkg.FullName() << " for " << End << std::endl;
752 continue;
753 }
3e9ab9f0 754
0eb4af9d 755 if (List->IsFlag(ConflictPkg,pkgOrderList::Removed) == true)
98ee4922 756 {
2252183c 757 if (Debug)
0eb4af9d
DK
758 clog << OutputInDepth(Depth) << "Ignoring " << End << " as " << ConflictPkg.FullName() << "was temporarily removed" << endl;
759 continue;
760 }
761
762 if (List->IsFlag(ConflictPkg,pkgOrderList::Loop) && PkgLoop)
763 {
764 if (End->Type == pkgCache::Dep::DpkgBreaks && End.IsMultiArchImplicit() == true)
440d3d65
DK
765 {
766 if (Debug)
0eb4af9d
DK
767 clog << OutputInDepth(Depth) << "Because dependency is MultiArchImplicit we ignored looping on: " << ConflictPkg << endl;
768 continue;
98ee4922 769 }
98ee4922 770 if (Debug)
440d3d65 771 {
0eb4af9d
DK
772 if (End->Type == pkgCache::Dep::DpkgBreaks)
773 clog << OutputInDepth(Depth) << "Because of breaks knot, deconfigure " << ConflictPkg.FullName() << " temporarily" << endl;
774 else
71e7a0f3 775 clog << OutputInDepth(Depth) << "Because of conflict knot, removing " << ConflictPkg.FullName() << " temporarily" << endl;
98ee4922 776 }
0eb4af9d
DK
777 if (EarlyRemove(ConflictPkg, &End) == false)
778 return _error->Error("Internal Error, Could not early remove %s (2)",ConflictPkg.FullName().c_str());
779 SomethingBad = true;
98ee4922
DK
780 continue;
781 }
782
0eb4af9d 783 if (Cache[ConflictPkg].Delete() == false)
98ee4922 784 {
0eb4af9d 785 if (Debug)
98ee4922 786 {
0eb4af9d
DK
787 clog << OutputInDepth(Depth) << "Unpacking " << ConflictPkg.FullName() << " to avoid " << End;
788 if (PkgLoop == true)
789 clog << " (Looping)";
790 clog << std::endl;
440d3d65 791 }
0eb4af9d
DK
792 // we would like to avoid temporary removals and all that at best via a simple unpack
793 _error->PushToStack();
794 if (NonLoopingSmart(UNPACK, Pkg, ConflictPkg, Depth, PkgLoop, NULL, &Changed) == false)
2264548f 795 {
0eb4af9d
DK
796 // but if it fails ignore this failure and look for alternative ways of solving
797 if (Debug)
440d3d65 798 {
0eb4af9d
DK
799 clog << OutputInDepth(Depth) << "Avoidance unpack of " << ConflictPkg.FullName() << " failed for " << End << std::endl;
800 _error->DumpErrors(std::clog);
801 }
802 _error->RevertToStack();
803 // ignorance can only happen if a) one of the offenders is already gone
804 if (List->IsFlag(ConflictPkg,pkgOrderList::Removed) == true)
440d3d65 805 {
0eb4af9d
DK
806 if (Debug)
807 clog << OutputInDepth(Depth) << "But " << ConflictPkg.FullName() << " was temporarily removed in the meantime to satisfy " << End << endl;
98ee4922 808 }
0eb4af9d 809 else if (List->IsFlag(Pkg,pkgOrderList::Removed) == true)
98ee4922
DK
810 {
811 if (Debug)
0eb4af9d 812 clog << OutputInDepth(Depth) << "But " << Pkg.FullName() << " was temporarily removed in the meantime to satisfy " << End << endl;
98ee4922 813 }
0eb4af9d 814 // or b) we can make one go (removal or dpkg auto-deconfigure)
98ee4922
DK
815 else
816 {
817 if (Debug)
0eb4af9d
DK
818 clog << OutputInDepth(Depth) << "So temprorary remove/deconfigure " << ConflictPkg.FullName() << " to satisfy " << End << endl;
819 if (EarlyRemove(ConflictPkg, &End) == false)
820 return _error->Error("Internal Error, Could not early remove %s (2)",ConflictPkg.FullName().c_str());
440d3d65 821 }
2264548f 822 }
0eb4af9d
DK
823 else
824 _error->MergeWithStack();
6b92f60c 825 }
0eb4af9d 826 else
6b92f60c
DK
827 {
828 if (Debug)
0eb4af9d
DK
829 clog << OutputInDepth(Depth) << "Removing " << ConflictPkg.FullName() << " now to avoid " << End << endl;
830 // no earlyremove() here as user has already agreed to the permanent removal
831 if (SmartRemove(Pkg) == false)
832 return _error->Error("Internal Error, Could not early remove %s (1)",ConflictPkg.FullName().c_str());
6b92f60c 833 }
6c139d6e
AL
834 }
835 }
6c139d6e 836 }
bce4caa3 837 if (i++ > max_loops)
91ea3def 838 return _error->Error("Internal error: APT::pkgPackageManager::MaxLoopCount reached in SmartConfigure for %s, aborting", Pkg.FullName().c_str());
98ee4922 839 } while (Changed == true);
0eb4af9d
DK
840
841 if (SomethingBad == true)
842 return _error->Error("Couldn't configure %s, probably a dependency cycle.", Pkg.FullName().c_str());
843
844 if (couldBeTemporaryRemoved == true && List->IsFlag(Pkg,pkgOrderList::Removed) == true)
845 {
846 if (Debug)
847 std::clog << OutputInDepth(Depth) << "Prevent unpack as " << Pkg << " is currently temporarily removed" << std::endl;
848 return true;
849 }
850
6c139d6e 851 // Check for reverse conflicts.
5af32db6 852 if (CheckRConflicts(Pkg,Pkg.RevDependsList(),
d77b985a 853 instVer.VerStr()) == false)
c7c7d3e8 854 return false;
5af32db6 855
d77b985a 856 for (PrvIterator P = instVer.ProvidesList();
f7f0d6c7 857 P.end() == false; ++P)
32d9baea
DK
858 if (Pkg->Group != P.OwnerPkg()->Group)
859 CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion());
70ae2409 860
75a90b93
DK
861 if (PkgLoop)
862 return true;
940f2160 863
d77b985a
DK
864 List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
865
2a2a7ef4 866 if (Immediate == true && (instVer->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
30426f48
DK
867 {
868 /* Do lockstep M-A:same unpacking in two phases:
869 First unpack all installed architectures, then the not installed.
870 This way we avoid that M-A: enabled packages are installed before
871 their older non-M-A enabled packages are replaced by newer versions */
872 bool const installed = Pkg->CurrentVer != 0;
36635720
DK
873 if (installed == true &&
874 (instVer != Pkg.CurrentVer() ||
875 ((Cache[Pkg].iFlags & pkgDepCache::ReInstall) == pkgDepCache::ReInstall)) &&
876 Install(Pkg,FileNames[Pkg->ID]) == false)
30426f48 877 return false;
d77b985a
DK
878 for (PkgIterator P = Pkg.Group().PackageList();
879 P.end() == false; P = Pkg.Group().NextPkg(P))
880 {
30426f48 881 if (P->CurrentVer == 0 || P == Pkg || List->IsFlag(P,pkgOrderList::UnPacked) == true ||
d77b985a
DK
882 Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
883 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
884 continue;
75a90b93 885 if (SmartUnPack(P, false, Depth + 1) == false)
30426f48 886 return false;
d77b985a 887 }
30426f48
DK
888 if (installed == false && Install(Pkg,FileNames[Pkg->ID]) == false)
889 return false;
890 for (PkgIterator P = Pkg.Group().PackageList();
891 P.end() == false; P = Pkg.Group().NextPkg(P))
892 {
893 if (P->CurrentVer != 0 || P == Pkg || List->IsFlag(P,pkgOrderList::UnPacked) == true ||
2b8b1e7a 894 List->IsFlag(P,pkgOrderList::Configured) == true ||
30426f48
DK
895 Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
896 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
897 continue;
75a90b93 898 if (SmartUnPack(P, false, Depth + 1) == false)
30426f48
DK
899 return false;
900 }
901 }
cd5e8444 902 // packages which are already unpacked don't need to be unpacked again
d4b4e5ea
DK
903 else if ((instVer != Pkg.CurrentVer() ||
904 ((Cache[Pkg].iFlags & pkgDepCache::ReInstall) == pkgDepCache::ReInstall)) &&
905 Install(Pkg,FileNames[Pkg->ID]) == false)
28166356
DK
906 return false;
907
d41d0e01 908 if (Immediate == true) {
590f1923 909 // Perform immedate configuration of the package.
d41d0e01 910 if (SmartConfigure(Pkg, Depth + 1) == false)
0eb4af9d 911 _error->Error(_("Could not perform immediate configuration on '%s'. "
90436124 912 "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.FullName().c_str(),2);
590f1923 913 }
6c139d6e
AL
914
915 return true;
916}
917 /*}}}*/
918// PM::OrderInstall - Installation ordering routine /*{{{*/
919// ---------------------------------------------------------------------
920/* */
281daf46 921pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
6c139d6e 922{
7a1b1f8b 923 if (CreateOrderList() == false)
281daf46
AL
924 return Failed;
925
926 Reset();
6c139d6e 927
30e1eab5 928 if (Debug == true)
5e312de7 929 clog << "Beginning to order" << endl;
6c139d6e 930
5e312de7
DK
931 bool const ordering =
932 _config->FindB("PackageManager::UnpackAll",true) ?
933 List->OrderUnpack(FileNames) : List->OrderCritical();
934 if (ordering == false)
281daf46
AL
935 {
936 _error->Error("Internal ordering error");
937 return Failed;
938 }
939
30e1eab5
AL
940 if (Debug == true)
941 clog << "Done ordering" << endl;
942
281daf46 943 bool DoneSomething = false;
91c03d37 944 for (pkgOrderList::iterator I = List->begin(); I != List->end(); ++I)
6c139d6e
AL
945 {
946 PkgIterator Pkg(Cache,*I);
0caa5a4c 947
281daf46
AL
948 if (List->IsNow(Pkg) == false)
949 {
0caa5a4c
DK
950 if (Debug == true)
951 clog << "Skipping already done " << Pkg.FullName() << endl;
281daf46
AL
952 continue;
953 }
0caa5a4c 954
2fd65468 955 if (List->IsMissing(Pkg) == true)
281daf46
AL
956 {
957 if (Debug == true)
90436124 958 clog << "Sequence completed at " << Pkg.FullName() << endl;
281daf46
AL
959 if (DoneSomething == false)
960 {
961 _error->Error("Internal Error, ordering was unable to handle the media swap");
962 return Failed;
963 }
964 return Incomplete;
965 }
6c139d6e
AL
966
967 // Sanity check
d0c59649
AL
968 if (Cache[Pkg].Keep() == true &&
969 Pkg.State() == pkgCache::PkgIterator::NeedsNothing &&
970 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)
281daf46 971 {
90436124 972 _error->Error("Internal Error, trying to manipulate a kept package (%s)",Pkg.FullName().c_str());
281daf46
AL
973 return Failed;
974 }
6c139d6e
AL
975
976 // Perform a delete or an install
977 if (Cache[Pkg].Delete() == true)
978 {
979 if (SmartRemove(Pkg) == false)
281daf46 980 return Failed;
6c139d6e
AL
981 }
982 else
d41d0e01 983 if (SmartUnPack(Pkg,List->IsFlag(Pkg,pkgOrderList::Immediate),0) == false)
281daf46
AL
984 return Failed;
985 DoneSomething = true;
590f1923
CB
986
987 if (ImmConfigureAll) {
1e3f4083 988 /* ConfigureAll here to pick up and packages left unconfigured because they were unpacked in the
590f1923 989 "PreUnpack Checks" section */
c7c7d3e8
CB
990 if (!ConfigureAll())
991 return Failed;
590f1923 992 }
6c139d6e 993 }
5e312de7 994
6c139d6e
AL
995 // Final run through the configure phase
996 if (ConfigureAll() == false)
281daf46 997 return Failed;
6c139d6e
AL
998
999 // Sanity check
91c03d37 1000 for (pkgOrderList::iterator I = List->begin(); I != List->end(); ++I)
281daf46 1001 {
6c139d6e 1002 if (List->IsFlag(*I,pkgOrderList::Configured) == false)
281daf46
AL
1003 {
1004 _error->Error("Internal error, packages left unconfigured. %s",
90436124 1005 PkgIterator(Cache,*I).FullName().c_str());
281daf46
AL
1006 return Failed;
1007 }
9fc57a59 1008 }
281daf46
AL
1009
1010 return Completed;
6c139d6e 1011}
3b1b0f29
MV
1012// PM::DoInstallPostFork - compat /*{{{*/
1013// ---------------------------------------------------------------------
1014 /*}}}*/
bd5f39b3 1015#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
3b1b0f29
MV
1016pkgPackageManager::OrderResult
1017pkgPackageManager::DoInstallPostFork(int statusFd)
1018{
bd5f39b3
MV
1019 APT::Progress::PackageManager *progress = new
1020 APT::Progress::PackageManagerProgressFd(statusFd);
1021 pkgPackageManager::OrderResult res = DoInstallPostFork(progress);
1022 delete progress;
1023 return res;
1024}
6c139d6e 1025 /*}}}*/
1d6386f3
MV
1026// PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
1027// ---------------------------------------------------------------------
1028pkgPackageManager::OrderResult
e6ad8031 1029pkgPackageManager::DoInstallPostFork(APT::Progress::PackageManager *progress)
1d6386f3 1030{
5e9458e2
MV
1031 bool goResult = Go(progress);
1032 if(goResult == false)
1033 return Failed;
1034
1035 return Res;
1d6386f3 1036};
bd5f39b3
MV
1037#else
1038pkgPackageManager::OrderResult
1039pkgPackageManager::DoInstallPostFork(int statusFd)
1040{
1041 bool goResult = Go(statusFd);
1042 if(goResult == false)
1043 return Failed;
1044
1045 return Res;
1046}
1047#endif
e6ad8031 1048 /*}}}*/
2a7e07c7
MV
1049// PM::DoInstall - Does the installation /*{{{*/
1050// ---------------------------------------------------------------------
3b1b0f29 1051/* compat */
bd5f39b3 1052#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
3b1b0f29
MV
1053pkgPackageManager::OrderResult
1054pkgPackageManager::DoInstall(int statusFd)
1055{
1056 APT::Progress::PackageManager *progress = new
1057 APT::Progress::PackageManagerProgressFd(statusFd);
1058 OrderResult res = DoInstall(progress);
1059 delete progress;
1060 return res;
1061 }
bd5f39b3
MV
1062#else
1063pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int statusFd)
1064{
1065 if(DoInstallPreFork() == Failed)
1066 return Failed;
1067
1068 return DoInstallPostFork(statusFd);
1069}
1070#endif
3b1b0f29
MV
1071 /*}}}*/
1072// PM::DoInstall - Does the installation /*{{{*/
1073// ---------------------------------------------------------------------
2a7e07c7
MV
1074/* This uses the filenames in FileNames and the information in the
1075 DepCache to perform the installation of packages.*/
bd5f39b3 1076#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
e6ad8031
MV
1077pkgPackageManager::OrderResult
1078pkgPackageManager::DoInstall(APT::Progress::PackageManager *progress)
2a7e07c7
MV
1079{
1080 if(DoInstallPreFork() == Failed)
1081 return Failed;
1082
e6ad8031 1083 return DoInstallPostFork(progress);
2a7e07c7 1084}
bd5f39b3 1085#endif
eef71338 1086 /*}}}*/