summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorArch Librarian <arch@canonical.com>2004-09-20 16:51:33 +0000
committerArch Librarian <arch@canonical.com>2004-09-20 16:51:33 +0000
commit7a1b1f8bd649113e99ecef0489e2f2194e283d1e (patch)
tree753f89e873612294a9a5a782294ebc2bf1c65462 /apt-pkg
parent30e1eab53324523297a24c18819b27aba7ce1fb4 (diff)
Dselect support
Author: jgg Date: 1998-11-22 23:37:03 GMT Dselect support
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/acquire.cc13
-rw-r--r--apt-pkg/packagemanager.cc106
-rw-r--r--apt-pkg/packagemanager.h3
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);