]> git.saurik.com Git - apt.git/blame - apt-pkg/packagemanager.cc
DropPrivs: Hard-fail if the user does not exist
[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 {
2f589691
MV
376 // Check each dependency and see if anything needs to be done
377 // so that it can be configured
2dd2c801
DK
378 Changed = false;
379 for (DepIterator D = instVer.DependsList(); D.end() == false; )
380 {
381 // Compute a single dependency element (glob or)
382 pkgCache::DepIterator Start, End;
383 D.GlobOr(Start,End);
384
385 if (End->Type != pkgCache::Dep::Depends)
386 continue;
387 Bad = true;
388
2f589691
MV
389 // the first pass checks if we its all good, i.e. if we have
390 // to do anything at all
2dd2c801
DK
391 for (DepIterator Cur = Start; true; ++Cur)
392 {
393 SPtrArray<Version *> VList = Cur.AllTargets();
394
395 for (Version **I = VList; *I != 0; ++I)
6c139d6e 396 {
2dd2c801
DK
397 VerIterator Ver(Cache,*I);
398 PkgIterator DepPkg = Ver.ParentPkg();
399
400 // Check if the current version of the package is available and will satisfy this dependency
401 if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
402 List->IsFlag(DepPkg,pkgOrderList::Removed) == false &&
403 DepPkg.State() == PkgIterator::NeedsNothing)
404 {
405 Bad = false;
406 break;
407 }
408
2f589691
MV
409 // Check if the version that is going to be installed will satisfy the dependency
410 if (Cache[DepPkg].InstallVer != *I || List->IsNow(DepPkg) == false)
411 continue;
412
413 if (PkgLoop == true)
414 {
415 if (Debug)
416 std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
417 Bad = false;
418 }
419 }
420
421 if (Cur == End || Bad == false)
422 break;
423 }
424
425 // this dependency is in a good state, so we can stop
426 if (Bad == false)
427 {
428 if (Debug)
429 std::clog << OutputInDepth(Depth) << "Found ok dep " << D.TargetPkg() << std::endl;
430 continue;
431 }
432
433 // Check for dependencies that have not been unpacked,
434 // probably due to loops.
435 for (DepIterator Cur = Start; true; ++Cur)
436 {
437 SPtrArray<Version *> VList = Cur.AllTargets();
438
439 for (Version **I = VList; *I != 0; ++I)
440 {
441 VerIterator Ver(Cache,*I);
442 PkgIterator DepPkg = Ver.ParentPkg();
443
444 // Check if the current version of the package is available and will satisfy this dependency
445 if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
446 List->IsFlag(DepPkg,pkgOrderList::Removed) == false &&
447 DepPkg.State() == PkgIterator::NeedsNothing)
448 continue;
449
2dd2c801 450 // Check if the version that is going to be installed will satisfy the dependency
42d51f33 451 if (Cache[DepPkg].InstallVer != *I || List->IsNow(DepPkg) == false)
2dd2c801
DK
452 continue;
453
42d51f33 454 if (PkgLoop == true)
2dd2c801 455 {
42d51f33
DK
456 if (Debug)
457 std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
458 Bad = false;
42d51f33
DK
459 }
460 else
461 {
462 if (Debug)
463 clog << OutputInDepth(Depth) << "Unpacking " << DepPkg.FullName() << " to avoid loop " << Cur << endl;
0eb4af9d 464 if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 465 return false;
2dd2c801 466 }
2f589691
MV
467 // at this point we either unpacked a Dep or we are in a loop,
468 // no need to unpack a second one
0eb4af9d 469 break;
590f1923 470 }
42d51f33
DK
471
472 if (Cur == End || Bad == false)
2dd2c801 473 break;
42d51f33 474 }
2dd2c801
DK
475
476 if (Bad == false)
477 continue;
478
42d51f33
DK
479 needConfigure.push_back(Start);
480 }
481 if (i++ > max_loops)
482 return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack (1) for %s, aborting", Pkg.FullName().c_str());
483 } while (Changed == true);
484
2f589691 485 // now go over anything that needs configuring
42d51f33
DK
486 Bad = false, Changed = false, i = 0;
487 do
488 {
489 Changed = false;
6420c00e 490 for (std::list<DepIterator>::const_iterator D = needConfigure.begin(); D != needConfigure.end(); ++D)
42d51f33 491 {
6420c00e 492 // Compute a single dependency element (glob or) without modifying D
42d51f33 493 pkgCache::DepIterator Start, End;
6420c00e
DK
494 {
495 pkgCache::DepIterator Discard = *D;
496 Discard.GlobOr(Start,End);
497 }
42d51f33
DK
498
499 if (End->Type != pkgCache::Dep::Depends)
500 continue;
501 Bad = true;
502
503 // Search for dependencies which are unpacked but aren't configured yet (maybe loops)
2dd2c801
DK
504 for (DepIterator Cur = Start; true; ++Cur)
505 {
506 SPtrArray<Version *> VList = Cur.AllTargets();
507
508 for (Version **I = VList; *I != 0; ++I)
509 {
510 VerIterator Ver(Cache,*I);
511 PkgIterator DepPkg = Ver.ParentPkg();
512
513 // Check if the version that is going to be installed will satisfy the dependency
42d51f33 514 if (Cache[DepPkg].InstallVer != *I)
2dd2c801
DK
515 continue;
516
42d51f33 517 if (List->IsFlag(DepPkg,pkgOrderList::UnPacked))
d9f6c795 518 {
42d51f33
DK
519 if (List->IsFlag(DepPkg,pkgOrderList::Loop) && PkgLoop)
520 {
521 // This dependency has already been dealt with by another SmartConfigure on Pkg
522 Bad = false;
523 break;
524 }
0eb4af9d
DK
525 if (Debug)
526 std::clog << OutputInDepth(Depth) << "Configure already unpacked " << DepPkg << std::endl;
527 if (NonLoopingSmart(CONFIGURE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 528 return false;
71e7a0f3 529 break;
0eb4af9d 530
d9f6c795 531 }
42d51f33
DK
532 else if (List->IsFlag(DepPkg,pkgOrderList::Configured))
533 {
534 Bad = false;
535 break;
536 }
590f1923 537 }
42d51f33 538 if (Cur == End || Bad == false)
2dd2c801 539 break;
42d51f33
DK
540 }
541
542
2dd2c801 543 if (Bad == true && Changed == false && Debug == true)
6420c00e 544 std::clog << OutputInDepth(Depth) << "Could not satisfy " << *D << std::endl;
6c139d6e 545 }
bce4caa3 546 if (i++ > max_loops)
42d51f33 547 return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack (2) for %s, aborting", Pkg.FullName().c_str());
2dd2c801 548 } while (Changed == true);
0eb4af9d 549
71e7a0f3
DK
550 if (Bad == true)
551 return _error->Error(_("Could not configure '%s'. "),Pkg.FullName().c_str());
0eb4af9d 552
a99d02a8 553 if (PkgLoop) return true;
5e312de7
DK
554
555 static std::string const conf = _config->Find("PackageManager::Configure","all");
556 static bool const ConfigurePkgs = (conf == "all" || conf == "smart");
557
0eb4af9d 558 if (List->IsFlag(Pkg,pkgOrderList::Configured))
90436124 559 return _error->Error("Internal configure error on '%s'.", Pkg.FullName().c_str());
5e312de7 560
590f1923
CB
561 if (ConfigurePkgs == true && Configure(Pkg) == false)
562 return false;
75a90b93 563
590f1923 564 List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
6c139d6e 565
894d672e 566 if ((Cache[Pkg].InstVerIter(Cache)->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
d77b985a
DK
567 for (PkgIterator P = Pkg.Group().PackageList();
568 P.end() == false; P = Pkg.Group().NextPkg(P))
569 {
570 if (Pkg == P || List->IsFlag(P,pkgOrderList::Configured) == true ||
2b8b1e7a 571 List->IsFlag(P,pkgOrderList::UnPacked) == false ||
d77b985a
DK
572 Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
573 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
574 continue;
71e7a0f3
DK
575 if (SmartConfigure(P, (Depth +1)) == false)
576 return false;
d77b985a
DK
577 }
578
6c139d6e
AL
579 // Sanity Check
580 if (List->IsFlag(Pkg,pkgOrderList::Configured) == false)
90436124 581 return _error->Error(_("Could not configure '%s'. "),Pkg.FullName().c_str());
20382bad 582
6c139d6e
AL
583 return true;
584}
585 /*}}}*/
6c139d6e
AL
586// PM::EarlyRemove - Perform removal of packages before their time /*{{{*/
587// ---------------------------------------------------------------------
588/* This is called to deal with conflicts arising from unpacking */
589bool pkgPackageManager::EarlyRemove(PkgIterator Pkg)
0eb4af9d
DK
590{
591 return EarlyRemove(Pkg, NULL);
592}
593bool pkgPackageManager::EarlyRemove(PkgIterator Pkg, DepIterator const * const Dep)
6c139d6e
AL
594{
595 if (List->IsNow(Pkg) == false)
596 return true;
0eb4af9d 597
6c139d6e
AL
598 // Already removed it
599 if (List->IsFlag(Pkg,pkgOrderList::Removed) == true)
600 return true;
0eb4af9d 601
6c139d6e
AL
602 // Woops, it will not be re-installed!
603 if (List->IsFlag(Pkg,pkgOrderList::InList) == false)
604 return false;
9d4c8f67 605
0eb4af9d
DK
606 // these breaks on M-A:same packages can be dealt with. They 'loop' by design
607 if (Dep != NULL && (*Dep)->Type == pkgCache::Dep::DpkgBreaks && Dep->IsMultiArchImplicit() == true)
608 return true;
609
9d4c8f67 610 // Essential packages get special treatment
5af32db6 611 bool IsEssential = false;
c5200869
JAK
612 if ((Pkg->Flags & pkgCache::Flag::Essential) != 0 ||
613 (Pkg->Flags & pkgCache::Flag::Important) != 0)
5af32db6
AL
614 IsEssential = true;
615
0eb4af9d 616 /* Check for packages that are the dependents of essential packages and
5af32db6
AL
617 promote them too */
618 if (Pkg->CurrentVer != 0)
619 {
0eb4af9d 620 for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() == false &&
f7f0d6c7 621 IsEssential == false; ++D)
5af32db6 622 if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends)
c5200869
JAK
623 if ((D.ParentPkg()->Flags & pkgCache::Flag::Essential) != 0 ||
624 (D.ParentPkg()->Flags & pkgCache::Flag::Important) != 0)
5af32db6
AL
625 IsEssential = true;
626 }
627
628 if (IsEssential == true)
9d4c8f67
AL
629 {
630 if (_config->FindB("APT::Force-LoopBreak",false) == false)
b2e465d6
AL
631 return _error->Error(_("This installation run will require temporarily "
632 "removing the essential package %s due to a "
633 "Conflicts/Pre-Depends loop. This is often bad, "
634 "but if you really want to do it, activate the "
90436124 635 "APT::Force-LoopBreak option."),Pkg.FullName().c_str());
9d4c8f67 636 }
0eb4af9d
DK
637 // dpkg will auto-deconfigure it, no need for the big remove hammer
638 else if (Dep != NULL && (*Dep)->Type == pkgCache::Dep::DpkgBreaks)
639 return true;
640
6c139d6e
AL
641 bool Res = SmartRemove(Pkg);
642 if (Cache[Pkg].Delete() == false)
643 List->Flag(Pkg,pkgOrderList::Removed,pkgOrderList::States);
0eb4af9d 644
6c139d6e
AL
645 return Res;
646}
647 /*}}}*/
648// PM::SmartRemove - Removal Helper /*{{{*/
649// ---------------------------------------------------------------------
650/* */
651bool pkgPackageManager::SmartRemove(PkgIterator Pkg)
652{
653 if (List->IsNow(Pkg) == false)
654 return true;
655
656 List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
803ea2a8 657
28166356 658 return Remove(Pkg,(Cache[Pkg].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge);
6c139d6e
AL
659}
660 /*}}}*/
661// PM::SmartUnPack - Install helper /*{{{*/
662// ---------------------------------------------------------------------
1e3f4083 663/* This puts the system in a state where it can Unpack Pkg, if Pkg is already
590f1923 664 unpacked, or when it has been unpacked, if Immediate==true it configures it. */
6c139d6e 665bool pkgPackageManager::SmartUnPack(PkgIterator Pkg)
d77b985a 666{
d41d0e01 667 return SmartUnPack(Pkg, true, 0);
d77b985a 668}
d41d0e01 669bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int const Depth)
6c139d6e 670{
d41d0e01
CB
671 bool PkgLoop = List->IsFlag(Pkg,pkgOrderList::Loop);
672
987d8d03 673 if (Debug) {
90436124 674 clog << OutputInDepth(Depth) << "SmartUnPack " << Pkg.FullName();
987d8d03
CB
675 VerIterator InstallVer = VerIterator(Cache,Cache[Pkg].InstallVer);
676 if (Pkg.CurrentVer() == 0)
c4f931f8 677 clog << " (install version " << InstallVer.VerStr() << ")";
987d8d03 678 else
c4f931f8 679 clog << " (replace version " << Pkg.CurrentVer().VerStr() << " with " << InstallVer.VerStr() << ")";
d41d0e01 680 if (PkgLoop)
c4f931f8 681 clog << " (Only Perform PreUnpack Checks)";
0caa5a4c
DK
682 if (Immediate)
683 clog << " immediately";
c4f931f8 684 clog << endl;
987d8d03 685 }
cfcdf7fe 686
d77b985a
DK
687 VerIterator const instVer = Cache[Pkg].InstVerIter(Cache);
688
0eb4af9d 689 /* PreUnpack Checks: This loop checks and attempts to rectify any problems that would prevent the package being unpacked.
98ee4922 690 It addresses: PreDepends, Conflicts, Obsoletes and Breaks (DpkgBreaks). Any resolutions that do not require it should
c7c7d3e8 691 avoid configuration (calling SmartUnpack with Immediate=true), this is because when unpacking some packages with
0eb4af9d 692 complex dependency structures, trying to configure some packages while breaking the loops can complicate things.
98ee4922 693 This will be either dealt with if the package is configured as a dependency of Pkg (if and when Pkg is configured),
c7c7d3e8 694 or by the ConfigureAll call at the end of the for loop in OrderInstall. */
0eb4af9d
DK
695 bool SomethingBad = false, Changed = false;
696 bool couldBeTemporaryRemoved = Depth != 0 && List->IsFlag(Pkg,pkgOrderList::Removed) == false;
9c5104cf 697 const unsigned int max_loops = _config->FindI("APT::pkgPackageManager::MaxLoopCount", 5000);
5ab7b53b 698 unsigned int i = 0;
bce4caa3
MV
699 do
700 {
98ee4922
DK
701 Changed = false;
702 for (DepIterator D = instVer.DependsList(); D.end() == false; )
6c139d6e 703 {
98ee4922
DK
704 // Compute a single dependency element (glob or)
705 pkgCache::DepIterator Start, End;
706 D.GlobOr(Start,End);
f4945db3 707
98ee4922
DK
708 if (End->Type == pkgCache::Dep::PreDepends)
709 {
710 bool Bad = true;
711 if (Debug)
712 clog << OutputInDepth(Depth) << "PreDepends order for " << Pkg.FullName() << std::endl;
713
714 // Look for easy targets: packages that are already okay
715 for (DepIterator Cur = Start; Bad == true; ++Cur)
6c139d6e 716 {
d8e25d34 717 SPtrArray<Version *> VList = Cur.AllTargets();
98ee4922
DK
718 for (Version **I = VList; *I != 0; ++I)
719 {
720 VerIterator Ver(Cache,*I);
721 PkgIterator Pkg = Ver.ParentPkg();
722
723 // See if the current version is ok
724 if (Pkg.CurrentVer() == Ver && List->IsNow(Pkg) == true &&
725 Pkg.State() == PkgIterator::NeedsNothing)
726 {
727 Bad = false;
728 if (Debug)
729 clog << OutputInDepth(Depth) << "Found ok package " << Pkg.FullName() << endl;
730 break;
731 }
732 }
733 if (Cur == End)
734 break;
17182c0c 735 }
6c139d6e 736
98ee4922 737 // Look for something that could be configured.
275024e9 738 for (DepIterator Cur = Start; Bad == true && Cur.end() == false; ++Cur)
98ee4922 739 {
d8e25d34 740 SPtrArray<Version *> VList = Cur.AllTargets();
98ee4922
DK
741 for (Version **I = VList; *I != 0; ++I)
742 {
743 VerIterator Ver(Cache,*I);
0eb4af9d 744 PkgIterator DepPkg = Ver.ParentPkg();
1006601e 745
98ee4922 746 // Not the install version
0eb4af9d
DK
747 if (Cache[DepPkg].InstallVer != *I ||
748 (Cache[DepPkg].Keep() == true && DepPkg.State() == PkgIterator::NeedsNothing))
98ee4922
DK
749 continue;
750
0eb4af9d 751 if (List->IsFlag(DepPkg,pkgOrderList::Configured))
98ee4922
DK
752 {
753 Bad = false;
754 break;
755 }
756
757 // check if it needs unpack or if if configure is enough
0eb4af9d 758 if (List->IsFlag(DepPkg,pkgOrderList::UnPacked) == false)
98ee4922
DK
759 {
760 if (Debug)
0eb4af9d
DK
761 clog << OutputInDepth(Depth) << "Trying to SmartUnpack " << DepPkg.FullName() << endl;
762 if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 763 return false;
98ee4922
DK
764 }
765 else
766 {
767 if (Debug)
0eb4af9d
DK
768 clog << OutputInDepth(Depth) << "Trying to SmartConfigure " << DepPkg.FullName() << endl;
769 if (NonLoopingSmart(CONFIGURE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
71e7a0f3 770 return false;
98ee4922 771 }
0eb4af9d 772 break;
e2a5ff0c 773 }
6c139d6e 774 }
98ee4922
DK
775
776 if (Bad == true)
0eb4af9d 777 SomethingBad = true;
6c139d6e 778 }
98ee4922 779 else if (End->Type == pkgCache::Dep::Conflicts ||
0eb4af9d
DK
780 End->Type == pkgCache::Dep::Obsoletes ||
781 End->Type == pkgCache::Dep::DpkgBreaks)
cfcdf7fe 782 {
98ee4922 783 SPtrArray<Version *> VList = End.AllTargets();
0eb4af9d 784 for (Version **I = VList; *I != 0; ++I)
3e9ab9f0 785 {
98ee4922
DK
786 VerIterator Ver(Cache,*I);
787 PkgIterator ConflictPkg = Ver.ParentPkg();
0eb4af9d
DK
788 if (ConflictPkg.CurrentVer() != Ver)
789 {
790 if (Debug)
791 std::clog << OutputInDepth(Depth) << "Ignore not-installed version " << Ver.VerStr() << " of " << ConflictPkg.FullName() << " for " << End << std::endl;
792 continue;
793 }
3e9ab9f0 794
0eb4af9d 795 if (List->IsNow(ConflictPkg) == false)
98ee4922 796 {
2252183c 797 if (Debug)
0eb4af9d
DK
798 std::clog << OutputInDepth(Depth) << "Ignore already dealt-with version " << Ver.VerStr() << " of " << ConflictPkg.FullName() << " for " << End << std::endl;
799 continue;
800 }
3e9ab9f0 801
0eb4af9d 802 if (List->IsFlag(ConflictPkg,pkgOrderList::Removed) == true)
98ee4922 803 {
2252183c 804 if (Debug)
0eb4af9d
DK
805 clog << OutputInDepth(Depth) << "Ignoring " << End << " as " << ConflictPkg.FullName() << "was temporarily removed" << endl;
806 continue;
807 }
808
809 if (List->IsFlag(ConflictPkg,pkgOrderList::Loop) && PkgLoop)
810 {
811 if (End->Type == pkgCache::Dep::DpkgBreaks && End.IsMultiArchImplicit() == true)
440d3d65
DK
812 {
813 if (Debug)
0eb4af9d
DK
814 clog << OutputInDepth(Depth) << "Because dependency is MultiArchImplicit we ignored looping on: " << ConflictPkg << endl;
815 continue;
98ee4922 816 }
98ee4922 817 if (Debug)
440d3d65 818 {
0eb4af9d
DK
819 if (End->Type == pkgCache::Dep::DpkgBreaks)
820 clog << OutputInDepth(Depth) << "Because of breaks knot, deconfigure " << ConflictPkg.FullName() << " temporarily" << endl;
821 else
71e7a0f3 822 clog << OutputInDepth(Depth) << "Because of conflict knot, removing " << ConflictPkg.FullName() << " temporarily" << endl;
98ee4922 823 }
0eb4af9d
DK
824 if (EarlyRemove(ConflictPkg, &End) == false)
825 return _error->Error("Internal Error, Could not early remove %s (2)",ConflictPkg.FullName().c_str());
826 SomethingBad = true;
98ee4922
DK
827 continue;
828 }
829
0eb4af9d 830 if (Cache[ConflictPkg].Delete() == false)
98ee4922 831 {
0eb4af9d 832 if (Debug)
98ee4922 833 {
0eb4af9d
DK
834 clog << OutputInDepth(Depth) << "Unpacking " << ConflictPkg.FullName() << " to avoid " << End;
835 if (PkgLoop == true)
836 clog << " (Looping)";
837 clog << std::endl;
440d3d65 838 }
0eb4af9d
DK
839 // we would like to avoid temporary removals and all that at best via a simple unpack
840 _error->PushToStack();
841 if (NonLoopingSmart(UNPACK, Pkg, ConflictPkg, Depth, PkgLoop, NULL, &Changed) == false)
2264548f 842 {
0eb4af9d
DK
843 // but if it fails ignore this failure and look for alternative ways of solving
844 if (Debug)
440d3d65 845 {
0eb4af9d
DK
846 clog << OutputInDepth(Depth) << "Avoidance unpack of " << ConflictPkg.FullName() << " failed for " << End << std::endl;
847 _error->DumpErrors(std::clog);
848 }
849 _error->RevertToStack();
850 // ignorance can only happen if a) one of the offenders is already gone
851 if (List->IsFlag(ConflictPkg,pkgOrderList::Removed) == true)
440d3d65 852 {
0eb4af9d
DK
853 if (Debug)
854 clog << OutputInDepth(Depth) << "But " << ConflictPkg.FullName() << " was temporarily removed in the meantime to satisfy " << End << endl;
98ee4922 855 }
0eb4af9d 856 else if (List->IsFlag(Pkg,pkgOrderList::Removed) == true)
98ee4922
DK
857 {
858 if (Debug)
0eb4af9d 859 clog << OutputInDepth(Depth) << "But " << Pkg.FullName() << " was temporarily removed in the meantime to satisfy " << End << endl;
98ee4922 860 }
0eb4af9d 861 // or b) we can make one go (removal or dpkg auto-deconfigure)
98ee4922
DK
862 else
863 {
864 if (Debug)
0eb4af9d
DK
865 clog << OutputInDepth(Depth) << "So temprorary remove/deconfigure " << ConflictPkg.FullName() << " to satisfy " << End << endl;
866 if (EarlyRemove(ConflictPkg, &End) == false)
867 return _error->Error("Internal Error, Could not early remove %s (2)",ConflictPkg.FullName().c_str());
440d3d65 868 }
2264548f 869 }
0eb4af9d
DK
870 else
871 _error->MergeWithStack();
6b92f60c 872 }
0eb4af9d 873 else
6b92f60c
DK
874 {
875 if (Debug)
0eb4af9d
DK
876 clog << OutputInDepth(Depth) << "Removing " << ConflictPkg.FullName() << " now to avoid " << End << endl;
877 // no earlyremove() here as user has already agreed to the permanent removal
878 if (SmartRemove(Pkg) == false)
879 return _error->Error("Internal Error, Could not early remove %s (1)",ConflictPkg.FullName().c_str());
6b92f60c 880 }
6c139d6e
AL
881 }
882 }
6c139d6e 883 }
bce4caa3 884 if (i++ > max_loops)
91ea3def 885 return _error->Error("Internal error: APT::pkgPackageManager::MaxLoopCount reached in SmartConfigure for %s, aborting", Pkg.FullName().c_str());
98ee4922 886 } while (Changed == true);
0eb4af9d
DK
887
888 if (SomethingBad == true)
889 return _error->Error("Couldn't configure %s, probably a dependency cycle.", Pkg.FullName().c_str());
890
891 if (couldBeTemporaryRemoved == true && List->IsFlag(Pkg,pkgOrderList::Removed) == true)
892 {
893 if (Debug)
894 std::clog << OutputInDepth(Depth) << "Prevent unpack as " << Pkg << " is currently temporarily removed" << std::endl;
895 return true;
896 }
897
6c139d6e 898 // Check for reverse conflicts.
5af32db6 899 if (CheckRConflicts(Pkg,Pkg.RevDependsList(),
d77b985a 900 instVer.VerStr()) == false)
c7c7d3e8 901 return false;
5af32db6 902
d77b985a 903 for (PrvIterator P = instVer.ProvidesList();
f7f0d6c7 904 P.end() == false; ++P)
32d9baea
DK
905 if (Pkg->Group != P.OwnerPkg()->Group)
906 CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion());
70ae2409 907
75a90b93
DK
908 if (PkgLoop)
909 return true;
940f2160 910
d77b985a
DK
911 List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
912
2a2a7ef4 913 if (Immediate == true && (instVer->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
30426f48
DK
914 {
915 /* Do lockstep M-A:same unpacking in two phases:
916 First unpack all installed architectures, then the not installed.
917 This way we avoid that M-A: enabled packages are installed before
918 their older non-M-A enabled packages are replaced by newer versions */
919 bool const installed = Pkg->CurrentVer != 0;
36635720
DK
920 if (installed == true &&
921 (instVer != Pkg.CurrentVer() ||
922 ((Cache[Pkg].iFlags & pkgDepCache::ReInstall) == pkgDepCache::ReInstall)) &&
923 Install(Pkg,FileNames[Pkg->ID]) == false)
30426f48 924 return false;
d77b985a
DK
925 for (PkgIterator P = Pkg.Group().PackageList();
926 P.end() == false; P = Pkg.Group().NextPkg(P))
927 {
30426f48 928 if (P->CurrentVer == 0 || P == Pkg || List->IsFlag(P,pkgOrderList::UnPacked) == true ||
d77b985a
DK
929 Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
930 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
931 continue;
75a90b93 932 if (SmartUnPack(P, false, Depth + 1) == false)
30426f48 933 return false;
d77b985a 934 }
30426f48
DK
935 if (installed == false && Install(Pkg,FileNames[Pkg->ID]) == false)
936 return false;
937 for (PkgIterator P = Pkg.Group().PackageList();
938 P.end() == false; P = Pkg.Group().NextPkg(P))
939 {
940 if (P->CurrentVer != 0 || P == Pkg || List->IsFlag(P,pkgOrderList::UnPacked) == true ||
2b8b1e7a 941 List->IsFlag(P,pkgOrderList::Configured) == true ||
30426f48
DK
942 Cache[P].InstallVer == 0 || (P.CurrentVer() == Cache[P].InstallVer &&
943 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall))
944 continue;
75a90b93 945 if (SmartUnPack(P, false, Depth + 1) == false)
30426f48
DK
946 return false;
947 }
948 }
cd5e8444 949 // packages which are already unpacked don't need to be unpacked again
d4b4e5ea
DK
950 else if ((instVer != Pkg.CurrentVer() ||
951 ((Cache[Pkg].iFlags & pkgDepCache::ReInstall) == pkgDepCache::ReInstall)) &&
952 Install(Pkg,FileNames[Pkg->ID]) == false)
28166356
DK
953 return false;
954
d41d0e01 955 if (Immediate == true) {
590f1923 956 // Perform immedate configuration of the package.
d41d0e01 957 if (SmartConfigure(Pkg, Depth + 1) == false)
0eb4af9d 958 _error->Error(_("Could not perform immediate configuration on '%s'. "
90436124 959 "Please see man 5 apt.conf under APT::Immediate-Configure for details. (%d)"),Pkg.FullName().c_str(),2);
590f1923 960 }
6c139d6e
AL
961
962 return true;
963}
964 /*}}}*/
965// PM::OrderInstall - Installation ordering routine /*{{{*/
966// ---------------------------------------------------------------------
967/* */
281daf46 968pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
6c139d6e 969{
7a1b1f8b 970 if (CreateOrderList() == false)
281daf46
AL
971 return Failed;
972
973 Reset();
6c139d6e 974
30e1eab5 975 if (Debug == true)
5e312de7 976 clog << "Beginning to order" << endl;
6c139d6e 977
5e312de7
DK
978 bool const ordering =
979 _config->FindB("PackageManager::UnpackAll",true) ?
980 List->OrderUnpack(FileNames) : List->OrderCritical();
981 if (ordering == false)
281daf46
AL
982 {
983 _error->Error("Internal ordering error");
984 return Failed;
985 }
986
30e1eab5
AL
987 if (Debug == true)
988 clog << "Done ordering" << endl;
989
281daf46 990 bool DoneSomething = false;
91c03d37 991 for (pkgOrderList::iterator I = List->begin(); I != List->end(); ++I)
6c139d6e
AL
992 {
993 PkgIterator Pkg(Cache,*I);
0caa5a4c 994
281daf46
AL
995 if (List->IsNow(Pkg) == false)
996 {
0caa5a4c
DK
997 if (Debug == true)
998 clog << "Skipping already done " << Pkg.FullName() << endl;
281daf46
AL
999 continue;
1000 }
0caa5a4c 1001
2fd65468 1002 if (List->IsMissing(Pkg) == true)
281daf46
AL
1003 {
1004 if (Debug == true)
90436124 1005 clog << "Sequence completed at " << Pkg.FullName() << endl;
281daf46
AL
1006 if (DoneSomething == false)
1007 {
1008 _error->Error("Internal Error, ordering was unable to handle the media swap");
1009 return Failed;
1010 }
1011 return Incomplete;
1012 }
6c139d6e
AL
1013
1014 // Sanity check
d0c59649
AL
1015 if (Cache[Pkg].Keep() == true &&
1016 Pkg.State() == pkgCache::PkgIterator::NeedsNothing &&
1017 (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)
281daf46 1018 {
90436124 1019 _error->Error("Internal Error, trying to manipulate a kept package (%s)",Pkg.FullName().c_str());
281daf46
AL
1020 return Failed;
1021 }
6c139d6e
AL
1022
1023 // Perform a delete or an install
1024 if (Cache[Pkg].Delete() == true)
1025 {
1026 if (SmartRemove(Pkg) == false)
281daf46 1027 return Failed;
6c139d6e
AL
1028 }
1029 else
d41d0e01 1030 if (SmartUnPack(Pkg,List->IsFlag(Pkg,pkgOrderList::Immediate),0) == false)
281daf46
AL
1031 return Failed;
1032 DoneSomething = true;
590f1923
CB
1033
1034 if (ImmConfigureAll) {
1e3f4083 1035 /* ConfigureAll here to pick up and packages left unconfigured because they were unpacked in the
590f1923 1036 "PreUnpack Checks" section */
c7c7d3e8
CB
1037 if (!ConfigureAll())
1038 return Failed;
590f1923 1039 }
6c139d6e 1040 }
5e312de7 1041
6c139d6e
AL
1042 // Final run through the configure phase
1043 if (ConfigureAll() == false)
281daf46 1044 return Failed;
6c139d6e
AL
1045
1046 // Sanity check
91c03d37 1047 for (pkgOrderList::iterator I = List->begin(); I != List->end(); ++I)
281daf46 1048 {
6c139d6e 1049 if (List->IsFlag(*I,pkgOrderList::Configured) == false)
281daf46
AL
1050 {
1051 _error->Error("Internal error, packages left unconfigured. %s",
90436124 1052 PkgIterator(Cache,*I).FullName().c_str());
281daf46
AL
1053 return Failed;
1054 }
9fc57a59 1055 }
281daf46
AL
1056
1057 return Completed;
6c139d6e 1058}
3b1b0f29
MV
1059// PM::DoInstallPostFork - compat /*{{{*/
1060// ---------------------------------------------------------------------
1061 /*}}}*/
bd5f39b3 1062#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
3b1b0f29
MV
1063pkgPackageManager::OrderResult
1064pkgPackageManager::DoInstallPostFork(int statusFd)
1065{
bd5f39b3
MV
1066 APT::Progress::PackageManager *progress = new
1067 APT::Progress::PackageManagerProgressFd(statusFd);
1068 pkgPackageManager::OrderResult res = DoInstallPostFork(progress);
1069 delete progress;
1070 return res;
1071}
6c139d6e 1072 /*}}}*/
1d6386f3
MV
1073// PM::DoInstallPostFork - Does install part that happens after the fork /*{{{*/
1074// ---------------------------------------------------------------------
1075pkgPackageManager::OrderResult
e6ad8031 1076pkgPackageManager::DoInstallPostFork(APT::Progress::PackageManager *progress)
1d6386f3 1077{
5e9458e2
MV
1078 bool goResult = Go(progress);
1079 if(goResult == false)
1080 return Failed;
1081
1082 return Res;
1d6386f3 1083};
bd5f39b3
MV
1084#else
1085pkgPackageManager::OrderResult
1086pkgPackageManager::DoInstallPostFork(int statusFd)
1087{
1088 bool goResult = Go(statusFd);
1089 if(goResult == false)
1090 return Failed;
1091
1092 return Res;
1093}
1094#endif
e6ad8031 1095 /*}}}*/
2a7e07c7
MV
1096// PM::DoInstall - Does the installation /*{{{*/
1097// ---------------------------------------------------------------------
3b1b0f29 1098/* compat */
bd5f39b3 1099#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
3b1b0f29
MV
1100pkgPackageManager::OrderResult
1101pkgPackageManager::DoInstall(int statusFd)
1102{
1103 APT::Progress::PackageManager *progress = new
1104 APT::Progress::PackageManagerProgressFd(statusFd);
1105 OrderResult res = DoInstall(progress);
1106 delete progress;
1107 return res;
1108 }
bd5f39b3
MV
1109#else
1110pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int statusFd)
1111{
1112 if(DoInstallPreFork() == Failed)
1113 return Failed;
1114
1115 return DoInstallPostFork(statusFd);
1116}
1117#endif
3b1b0f29
MV
1118 /*}}}*/
1119// PM::DoInstall - Does the installation /*{{{*/
1120// ---------------------------------------------------------------------
2a7e07c7
MV
1121/* This uses the filenames in FileNames and the information in the
1122 DepCache to perform the installation of packages.*/
bd5f39b3 1123#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
e6ad8031
MV
1124pkgPackageManager::OrderResult
1125pkgPackageManager::DoInstall(APT::Progress::PackageManager *progress)
2a7e07c7
MV
1126{
1127 if(DoInstallPreFork() == Failed)
1128 return Failed;
1129
e6ad8031 1130 return DoInstallPostFork(progress);
2a7e07c7 1131}
bd5f39b3 1132#endif
eef71338 1133 /*}}}*/