diff options
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/acquire.cc | 13 | ||||
-rw-r--r-- | apt-pkg/packagemanager.cc | 106 | ||||
-rw-r--r-- | apt-pkg/packagemanager.h | 3 |
3 files changed, 72 insertions, 50 deletions
diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index 353e2f698..3bd7662fd 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: acquire.cc,v 1.16 1998/11/14 01:39:45 jgg Exp $ +// $Id: acquire.cc,v 1.17 1998/11/22 23:37:03 jgg Exp $ /* ###################################################################### Acquire - File Acquiration @@ -459,11 +459,14 @@ pkgAcquire::Queue::~Queue() /* */ void pkgAcquire::Queue::Enqueue(ItemDesc &Item) { + QItem **I = &Items; + for (; *I != 0; I = &(*I)->Next); + // Create a new item - QItem *I = new QItem; - I->Next = Items; - Items = I; - *I = Item; + QItem *Itm = new QItem; + *Itm = Item; + Itm->Next = 0; + *I = Itm; Item.Owner->QueueCounter++; if (Items->Next == 0) diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc index e6222f003..7dd6b8a27 100644 --- a/apt-pkg/packagemanager.cc +++ b/apt-pkg/packagemanager.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: packagemanager.cc,v 1.6 1998/11/22 03:20:33 jgg Exp $ +// $Id: packagemanager.cc,v 1.7 1998/11/22 23:37:05 jgg Exp $ /* ###################################################################### Package Manager - Abstacts the package manager @@ -51,18 +51,24 @@ pkgPackageManager::~pkgPackageManager() bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources, pkgRecords *Recs) { - pkgCache::PkgIterator I = Cache.PkgBegin(); - for (;I.end() != true; I++) - { - // Not interesting - if ((Cache[I].InstallVer == (pkgCache::Version *)I.CurrentVer() && - I.State() != pkgCache::PkgIterator::NeedsUnpack) || - Cache[I].Delete() == true) + if (CreateOrderList() == false) + return false; + + if (List->OrderUnpack() == false) + return _error->Error("Internal ordering error"); + + for (pkgOrderList::iterator I = List->begin(); I != List->end(); I++) + { + PkgIterator Pkg(Cache,*I); + + // Skip packages to erase + if (Cache[Pkg].Delete() == true) continue; - new pkgAcqArchive(Owner,Sources,Recs,Cache[I].InstVerIter(Cache), - FileNames[I->ID]); + new pkgAcqArchive(Owner,Sources,Recs,Cache[Pkg].InstVerIter(Cache), + FileNames[Pkg->ID]); } + return true; } /*}}}*/ @@ -88,6 +94,50 @@ bool pkgPackageManager::FixMissing() } /*}}}*/ +// PM::CreateOrderList - Create the ordering class /*{{{*/ +// --------------------------------------------------------------------- +/* This populates the ordering list with all the packages that are + going to change. */ +bool pkgPackageManager::CreateOrderList() +{ + delete List; + List = new pkgOrderList(Cache); + + // Generate the list of affected packages and sort it + for (PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) + { + // Consider all depends + if ((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) + { + List->Flag(I,pkgOrderList::Immediate); + if (Cache[I].InstallVer != 0) + for (DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); + D.end() == false; D++) + if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends) + List->Flag(D.TargetPkg(),pkgOrderList::Immediate); + if (I->CurrentVer != 0) + for (DepIterator D = I.CurrentVer().DependsList(); + D.end() == false; D++) + if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends) + List->Flag(D.TargetPkg(),pkgOrderList::Immediate); + } + + // Not interesting + if ((Cache[I].Keep() == true || + Cache[I].InstVerIter(Cache) == I.CurrentVer()) && + I.State() == pkgCache::PkgIterator::NeedsNothing) + continue; + + // Append it to the list + List->push_back(I); + + if ((I->Flags & pkgCache::Flag::ImmediateConf) == pkgCache::Flag::ImmediateConf) + List->Flag(I,pkgOrderList::Immediate); + } + + return true; +} + /*}}}*/ // PM::DepAlwaysTrue - Returns true if this dep is irrelevent /*{{{*/ // --------------------------------------------------------------------- /* The restriction on provides is to eliminate the case when provides @@ -412,41 +462,9 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg) /* */ bool pkgPackageManager::OrderInstall() { - delete List; - List = new pkgOrderList(Cache); + if (CreateOrderList() == false) + return false; - // Generate the list of affected packages and sort it - for (PkgIterator I = Cache.PkgBegin(); I.end() == false; I++) - { - // Consider all depends - if ((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) - { - List->Flag(I,pkgOrderList::Immediate); - if (Cache[I].InstallVer != 0) - for (DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); - D.end() == false; D++) - if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends) - List->Flag(D.TargetPkg(),pkgOrderList::Immediate); - if (I->CurrentVer != 0) - for (DepIterator D = I.CurrentVer().DependsList(); - D.end() == false; D++) - if (D->Type == pkgCache::Dep::Depends || D->Type == pkgCache::Dep::PreDepends) - List->Flag(D.TargetPkg(),pkgOrderList::Immediate); - } - - // Not interesting - if ((Cache[I].Keep() == true || - Cache[I].InstVerIter(Cache) == I.CurrentVer()) && - I.State() == pkgCache::PkgIterator::NeedsNothing) - continue; - - // Append it to the list - List->push_back(I); - - if ((I->Flags & pkgCache::Flag::ImmediateConf) == pkgCache::Flag::ImmediateConf) - List->Flag(I,pkgOrderList::Immediate); - } - if (Debug == true) clog << "Begining to order" << endl; diff --git a/apt-pkg/packagemanager.h b/apt-pkg/packagemanager.h index e0e9dc108..5265c315c 100644 --- a/apt-pkg/packagemanager.h +++ b/apt-pkg/packagemanager.h @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: packagemanager.h,v 1.6 1998/11/22 03:20:34 jgg Exp $ +// $Id: packagemanager.h,v 1.7 1998/11/22 23:37:06 jgg Exp $ /* ###################################################################### Package Manager - Abstacts the package manager @@ -55,6 +55,7 @@ class pkgPackageManager bool DepAdd(pkgOrderList &Order,PkgIterator P,int Depth = 0); bool OrderInstall(); bool CheckRConflicts(PkgIterator Pkg,DepIterator Dep,const char *Ver); + bool CreateOrderList(); // Analysis helpers bool DepAlwaysTrue(DepIterator D); |