|
|
@ -1,6 +1,6 @@ |
|
|
|
// -*- mode: cpp; mode: fold -*-
|
|
|
|
// Description /*{{{*/
|
|
|
|
// $Id: orderlist.cc,v 1.3 1998/09/26 05:34:21 jgg Exp $
|
|
|
|
// $Id: orderlist.cc,v 1.4 1999/07/03 03:10:35 jgg Exp $
|
|
|
|
/* ######################################################################
|
|
|
|
|
|
|
|
Order List - Represents and Manipulates an ordered list of packages. |
|
|
@ -42,7 +42,7 @@ |
|
|
|
arbitary priority to give quite abit of control over the final unpacking |
|
|
|
order. |
|
|
|
|
|
|
|
The rules listed above my never be violated and are called Critical. |
|
|
|
The rules listed above may never be violated and are called Critical. |
|
|
|
When a critical rule is violated then a loop condition is recorded |
|
|
|
and will have to be delt with in the caller. |
|
|
|
|
|
|
@ -65,6 +65,7 @@ pkgOrderList *pkgOrderList::Me = 0; |
|
|
|
/* */ |
|
|
|
pkgOrderList::pkgOrderList(pkgDepCache &Cache) : Cache(Cache) |
|
|
|
{ |
|
|
|
FileList = 0; |
|
|
|
Primary = 0; |
|
|
|
Secondary = 0; |
|
|
|
RevDepends = 0; |
|
|
@ -93,7 +94,7 @@ pkgOrderList::~pkgOrderList() |
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
/* The caller is expeted to have setup the desired probe state */ |
|
|
|
bool pkgOrderList::DoRun() |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Temp list
|
|
|
|
unsigned long Size = Cache.HeaderP->PackageCount; |
|
|
|
Package **NList = new Package *[Size]; |
|
|
@ -128,6 +129,8 @@ bool pkgOrderList::DoRun() |
|
|
|
fatal and indicate that the packages cannot be installed. */ |
|
|
|
bool pkgOrderList::OrderCritical() |
|
|
|
{ |
|
|
|
FileList = 0; |
|
|
|
|
|
|
|
Primary = &DepUnPackPre; |
|
|
|
Secondary = 0; |
|
|
|
RevDepends = 0; |
|
|
@ -150,8 +153,10 @@ bool pkgOrderList::OrderCritical() |
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
/* This performs complete unpacking ordering and creates an order that is
|
|
|
|
suitable for unpacking */ |
|
|
|
bool pkgOrderList::OrderUnpack() |
|
|
|
bool pkgOrderList::OrderUnpack(string *FileList) |
|
|
|
{ |
|
|
|
this->FileList = FileList; |
|
|
|
|
|
|
|
Primary = &DepUnPackCrit; |
|
|
|
Secondary = &DepConfigure; |
|
|
|
RevDepends = &DepUnPackDep; |
|
|
@ -161,7 +166,7 @@ bool pkgOrderList::OrderUnpack() |
|
|
|
// Sort
|
|
|
|
Me = this; |
|
|
|
qsort(List,End - List,sizeof(*List),&OrderCompareA); |
|
|
|
|
|
|
|
|
|
|
|
if (DoRun() == false) |
|
|
|
return false; |
|
|
|
|
|
|
@ -197,6 +202,7 @@ bool pkgOrderList::OrderUnpack() |
|
|
|
for configuration */ |
|
|
|
bool pkgOrderList::OrderConfigure() |
|
|
|
{ |
|
|
|
FileList = 0; |
|
|
|
Primary = &DepConfigure; |
|
|
|
Secondary = 0; |
|
|
|
RevDepends = 0; |
|
|
@ -214,7 +220,11 @@ int pkgOrderList::Score(PkgIterator Pkg) |
|
|
|
// Removal is always done first
|
|
|
|
if (Cache[Pkg].Delete() == true) |
|
|
|
return 200; |
|
|
|
|
|
|
|
|
|
|
|
// This should never happen..
|
|
|
|
if (Cache[Pkg].InstVerIter(Cache).end() == true) |
|
|
|
return -1; |
|
|
|
|
|
|
|
int Score = 0; |
|
|
|
if ((Pkg->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential) |
|
|
|
Score += 100; |
|
|
@ -248,7 +258,7 @@ int pkgOrderList::FileCmp(PkgIterator A,PkgIterator B) |
|
|
|
|
|
|
|
if (Cache[A].InstVerIter(Cache).FileList().end() == true) |
|
|
|
return -1; |
|
|
|
if (Cache[A].InstVerIter(Cache).FileList().end() == true) |
|
|
|
if (Cache[B].InstVerIter(Cache).FileList().end() == true) |
|
|
|
return 1; |
|
|
|
|
|
|
|
pkgCache::PackageFile *FA = Cache[A].InstVerIter(Cache).FileList().File(); |
|
|
@ -260,6 +270,18 @@ int pkgOrderList::FileCmp(PkgIterator A,PkgIterator B) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// BoolCompare - Comparison function for two booleans /*{{{*/
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
/* */ |
|
|
|
static int BoolCompare(bool A,bool B) |
|
|
|
{ |
|
|
|
if (A == B) |
|
|
|
return 0; |
|
|
|
if (A == false) |
|
|
|
return -1; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
/*}}}*/ |
|
|
|
// OrderList::OrderCompareA - Order the installation by op /*{{{*/
|
|
|
|
// ---------------------------------------------------------------------
|
|
|
|
/* This provides a first-pass sort of the list and gives a decent starting
|
|
|
@ -269,6 +291,19 @@ int pkgOrderList::OrderCompareA(const void *a, const void *b) |
|
|
|
PkgIterator A(Me->Cache,*(Package **)a); |
|
|
|
PkgIterator B(Me->Cache,*(Package **)b); |
|
|
|
|
|
|
|
// We order packages with a set state toward the front
|
|
|
|
int Res; |
|
|
|
if ((Res = BoolCompare(Me->IsNow(A),Me->IsNow(B))) == 0) |
|
|
|
return -1*Res; |
|
|
|
|
|
|
|
// We order missing files to toward the end
|
|
|
|
if (Me->FileList != 0) |
|
|
|
{ |
|
|
|
if ((Res = BoolCompare(Me->FileList[A->ID].empty() && !Me->Cache[A].Delete(), |
|
|
|
Me->FileList[B->ID].empty() && !Me->Cache[B].Delete())) == 0) |
|
|
|
return -1*Res; |
|
|
|
} |
|
|
|
|
|
|
|
if (A.State() != pkgCache::PkgIterator::NeedsNothing && |
|
|
|
B.State() == pkgCache::PkgIterator::NeedsNothing) |
|
|
|
return -1; |
|
|
@ -419,34 +454,37 @@ bool pkgOrderList::VisitNode(PkgIterator Pkg) |
|
|
|
// Perform immedate configuration of the package if so flagged.
|
|
|
|
if (IsFlag(Pkg,Immediate) == true && Primary != &DepUnPackPre) |
|
|
|
Primary = &DepUnPackPreD; |
|
|
|
|
|
|
|
bool Res = true; |
|
|
|
if (Cache[Pkg].Delete() == false) |
|
|
|
|
|
|
|
if (IsNow(Pkg) == true) |
|
|
|
{ |
|
|
|
// Primary
|
|
|
|
Res &= Res && VisitDeps(Primary,Pkg); |
|
|
|
Res &= Res && VisitRDeps(Primary,Pkg); |
|
|
|
Res &= Res && VisitRProvides(Primary,Pkg.CurrentVer()); |
|
|
|
Res &= Res && VisitRProvides(Primary,Cache[Pkg].InstVerIter(Cache)); |
|
|
|
|
|
|
|
// RevDep
|
|
|
|
Res &= Res && VisitRDeps(RevDepends,Pkg); |
|
|
|
Res &= Res && VisitRProvides(RevDepends,Pkg.CurrentVer()); |
|
|
|
Res &= Res && VisitRProvides(RevDepends,Cache[Pkg].InstVerIter(Cache)); |
|
|
|
|
|
|
|
// Secondary
|
|
|
|
Res &= Res && VisitDeps(Secondary,Pkg); |
|
|
|
Res &= Res && VisitRDeps(Secondary,Pkg); |
|
|
|
Res &= Res && VisitRProvides(Secondary,Pkg.CurrentVer()); |
|
|
|
Res &= Res && VisitRProvides(Secondary,Cache[Pkg].InstVerIter(Cache)); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// RevDep
|
|
|
|
Res &= Res && VisitRDeps(Remove,Pkg); |
|
|
|
Res &= Res && VisitRProvides(Remove,Pkg.CurrentVer()); |
|
|
|
bool Res = true; |
|
|
|
if (Cache[Pkg].Delete() == false) |
|
|
|
{ |
|
|
|
// Primary
|
|
|
|
Res &= Res && VisitDeps(Primary,Pkg); |
|
|
|
Res &= Res && VisitRDeps(Primary,Pkg); |
|
|
|
Res &= Res && VisitRProvides(Primary,Pkg.CurrentVer()); |
|
|
|
Res &= Res && VisitRProvides(Primary,Cache[Pkg].InstVerIter(Cache)); |
|
|
|
|
|
|
|
// RevDep
|
|
|
|
Res &= Res && VisitRDeps(RevDepends,Pkg); |
|
|
|
Res &= Res && VisitRProvides(RevDepends,Pkg.CurrentVer()); |
|
|
|
Res &= Res && VisitRProvides(RevDepends,Cache[Pkg].InstVerIter(Cache)); |
|
|
|
|
|
|
|
// Secondary
|
|
|
|
Res &= Res && VisitDeps(Secondary,Pkg); |
|
|
|
Res &= Res && VisitRDeps(Secondary,Pkg); |
|
|
|
Res &= Res && VisitRProvides(Secondary,Pkg.CurrentVer()); |
|
|
|
Res &= Res && VisitRProvides(Secondary,Cache[Pkg].InstVerIter(Cache)); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// RevDep
|
|
|
|
Res &= Res && VisitRDeps(Remove,Pkg); |
|
|
|
Res &= Res && VisitRProvides(Remove,Pkg.CurrentVer()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (IsFlag(Pkg,Added) == false) |
|
|
|
{ |
|
|
|
Flag(Pkg,Added,Added | AddPending); |
|
|
|