summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorArch Librarian <arch@canonical.com>2004-09-20 16:51:10 +0000
committerArch Librarian <arch@canonical.com>2004-09-20 16:51:10 +0000
commitc88edf1d276eb4e01b92835163bdd8574ded93db (patch)
tree58a2a86710184e87288f16656294606a152ac02a /apt-pkg
parent24231681aa99e84c8a6aae5e54b7e207e19d6087 (diff)
Sync
Author: jgg Date: 1998-10-24 04:57:55 GMT Sync
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/acquire-item.cc64
-rw-r--r--apt-pkg/acquire-item.h12
-rw-r--r--apt-pkg/acquire-worker.cc45
-rw-r--r--apt-pkg/acquire-worker.h8
-rw-r--r--apt-pkg/acquire.cc32
-rw-r--r--apt-pkg/acquire.h7
-rw-r--r--apt-pkg/algorithms.cc20
-rw-r--r--apt-pkg/contrib/strutl.cc4
-rw-r--r--apt-pkg/depcache.cc199
-rw-r--r--apt-pkg/tagfile.cc11
10 files changed, 178 insertions, 224 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index e1049dde9..e6eee197b 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire-item.cc,v 1.3 1998/10/22 04:56:38 jgg Exp $
+// $Id: acquire-item.cc,v 1.4 1998/10/24 04:57:56 jgg Exp $
/* ######################################################################
Acquire Item - Item to acquire
@@ -22,6 +22,9 @@
#include <sys/stat.h>
#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h>
/*}}}*/
// Acquire::Item::Item - Constructor /*{{{*/
@@ -30,6 +33,7 @@
pkgAcquire::Item::Item(pkgAcquire *Owner) : Owner(Owner), QueueCounter(0)
{
Owner->Add(this);
+ Status = StatIdle;
}
/*}}}*/
// Acquire::Item::~Item - Destructor /*{{{*/
@@ -40,6 +44,27 @@ pkgAcquire::Item::~Item()
Owner->Remove(this);
}
/*}}}*/
+// Acquire::Item::Failed - Item failed to download /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void pkgAcquire::Item::Failed(string Message)
+{
+ Status = StatError;
+ ErrorText = LookupTag(Message,"Message");
+ if (QueueCounter <= 1)
+ Owner->Dequeue(this);
+}
+ /*}}}*/
+// Acquire::Item::Done - Item downloaded OK /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void pkgAcquire::Item::Done(string,unsigned long,string)
+{
+ Status = StatDone;
+ ErrorText = string();
+ Owner->Dequeue(this);
+}
+ /*}}}*/
// AcqIndex::AcqIndex - Constructor /*{{{*/
// ---------------------------------------------------------------------
@@ -100,3 +125,40 @@ string pkgAcqIndexRel::Custom600Headers()
return "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
}
/*}}}*/
+// AcqIndexRel::Done - Item downloaded OK /*{{{*/
+// ---------------------------------------------------------------------
+/* The release file was not placed into the download directory then
+ a copy URI is generated and it is copied there otherwise the file
+ in the partial directory is moved into .. and the URI is finished. */
+void pkgAcqIndexRel::Done(string Message,unsigned long Size,string MD5)
+{
+ Item::Done(Message,Size,MD5);
+
+ string FileName = LookupTag(Message,"Filename");
+ if (FileName.empty() == true)
+ {
+ Status = StatError;
+ ErrorText = "Method gave a blank filename";
+ }
+
+ // We have to copy it into place
+ if (FileName != DestFile)
+ {
+ QueueURI("copy:" + FileName,string());
+ return;
+ }
+
+ // Done, move it into position
+ string FinalFile = _config->FindDir("Dir::State::lists");
+ FinalFile += URItoFileName(Location->ReleaseURI());
+
+ if (rename(DestFile.c_str(),FinalFile.c_str()) != 0)
+ {
+ char S[300];
+ sprintf(S,"rename failed, %s (%s -> %s).",strerror(errno),
+ DestFile.c_str(),FinalFile.c_str());
+ Status = StatError;
+ ErrorText = S;
+ }
+}
+ /*}}}*/
diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h
index 8b2d6e908..352fc3e24 100644
--- a/apt-pkg/acquire-item.h
+++ b/apt-pkg/acquire-item.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire-item.h,v 1.2 1998/10/22 04:56:39 jgg Exp $
+// $Id: acquire-item.h,v 1.3 1998/10/24 04:57:57 jgg Exp $
/* ######################################################################
Acquire Item - Item to acquire
@@ -35,13 +35,19 @@ class pkgAcquire::Item
public:
+ // State of the item
+ enum {StatIdle, StatFetching, StatDone, StatError} Status;
+ string ErrorText;
+
// Number of queues we are inserted into
unsigned int QueueCounter;
// File to write the fetch into
string DestFile;
- virtual void Failed() {};
+ virtual void Failed(string Message);
+ virtual void Done(string Message,unsigned long Size,string Md5Hash);
+
virtual string Custom600Headers() {return string();};
Item(pkgAcquire *Owner);
@@ -71,6 +77,8 @@ class pkgAcqIndexRel : public pkgAcquire::Item
public:
+ virtual void Done(string Message,unsigned long Size,string Md5Hash);
+
virtual string Custom600Headers();
pkgAcqIndexRel(pkgAcquire *Owner,const pkgSourceList::Item *Location);
diff --git a/apt-pkg/acquire-worker.cc b/apt-pkg/acquire-worker.cc
index 58f67d979..936d469c3 100644
--- a/apt-pkg/acquire-worker.cc
+++ b/apt-pkg/acquire-worker.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire-worker.cc,v 1.5 1998/10/23 00:49:58 jgg Exp $
+// $Id: acquire-worker.cc,v 1.6 1998/10/24 04:57:58 jgg Exp $
/* ######################################################################
Acquire Worker
@@ -187,6 +187,11 @@ bool pkgAcquire::Worker::RunMessages()
if (End == Message.c_str())
return _error->Error("Invalid message from method %s: %s",Access.c_str(),Message.c_str());
+ string URI = LookupTag(Message,"URI");
+ pkgAcquire::Queue::QItem *Itm = 0;
+ if (URI.empty() == false)
+ Itm = OwnerQ->FindItem(URI,this);
+
// Determine the message number and dispatch
switch (Number)
{
@@ -209,15 +214,47 @@ bool pkgAcquire::Worker::RunMessages()
// 200 URI Start
case 200:
- break;
+ {
+ if (Itm == 0)
+ {
+ _error->Warning("Method gave invalid 200 URI Start message");
+ break;
+ }
+ CurrentItem = Itm;
+ CurrentSize = 0;
+ TotalSize = atoi(LookupTag(Message,"Size","0").c_str());
+
+ break;
+ }
// 201 URI Done
case 201:
- break;
+ {
+ if (Itm == 0)
+ {
+ _error->Warning("Method gave invalid 400 URI Failure message");
+ break;
+ }
+
+ Itm->Owner->Done(Message,atoi(LookupTag(Message,"Size","0").c_str()),
+ LookupTag(Message,"MD5-Hash"));
+ OwnerQ->ItemDone(Itm);
+ break;
+ }
// 400 URI Failure
case 400:
- break;
+ {
+ if (Itm == 0)
+ {
+ _error->Warning("Method gave invalid 400 URI Failure message");
+ break;
+ }
+
+ Itm->Owner->Failed(Message);
+ OwnerQ->ItemDone(Itm);
+ break;
+ }
// 401 General Failure
case 401:
diff --git a/apt-pkg/acquire-worker.h b/apt-pkg/acquire-worker.h
index d128ec8b2..eb04485b9 100644
--- a/apt-pkg/acquire-worker.h
+++ b/apt-pkg/acquire-worker.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire-worker.h,v 1.3 1998/10/22 04:56:42 jgg Exp $
+// $Id: acquire-worker.h,v 1.4 1998/10/24 04:57:59 jgg Exp $
/* ######################################################################
Acquire Worker - Worker process manager
@@ -65,10 +65,12 @@ class pkgAcquire::Worker
public:
+ // The curent method state
pkgAcquire::Queue::QItem *CurrentItem;
-
string Status;
-
+ unsigned long CurrentSize;
+ unsigned long TotalSize;
+
// Load the method and do the startup
bool QueueItem(pkgAcquire::Queue::QItem *Item);
bool Start();
diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc
index 80fee9af2..21aade75d 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.3 1998/10/22 04:56:43 jgg Exp $
+// $Id: acquire.cc,v 1.4 1998/10/24 04:58:01 jgg Exp $
/* ######################################################################
Acquire - File Acquiration
@@ -331,7 +331,7 @@ void pkgAcquire::Queue::Enqueue(Item *Owner,string URI,string Description)
Owner->QueueCounter++;
}
/*}}}*/
-// Queue::Dequeue - Remove and item from the queue /*{{{*/
+// Queue::Dequeue - Remove an item from the queue /*{{{*/
// ---------------------------------------------------------------------
/* */
void pkgAcquire::Queue::Dequeue(Item *Owner)
@@ -367,6 +367,7 @@ bool pkgAcquire::Queue::Startup()
if (Workers->Start() == false)
return false;
+ Items->Worker = Workers;
Workers->QueueItem(Items);
return true;
@@ -389,3 +390,30 @@ bool pkgAcquire::Queue::Shutdown()
return true;
}
/*}}}*/
+// Queue::Finditem - Find a URI in the item list /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+pkgAcquire::Queue::QItem *pkgAcquire::Queue::FindItem(string URI,pkgAcquire::Worker *Owner)
+{
+ for (QItem *I = Items; I != 0; I = I->Next)
+ if (I->URI == URI && I->Worker == Owner)
+ return I;
+ return 0;
+}
+ /*}}}*/
+// Queue::ItemDone - Item has been completed /*{{{*/
+// ---------------------------------------------------------------------
+/* The worker signals this which causes the item to be removed from the
+ queue. */
+bool pkgAcquire::Queue::ItemDone(QItem *Itm)
+{
+ Dequeue(Itm->Owner);
+
+ if (Items == 0)
+ return true;
+
+ Items->Worker = Workers;
+ Items->Owner->Status = pkgAcquire::Item::StatFetching;
+ return Workers->QueueItem(Items);
+}
+ /*}}}*/
diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h
index cea7c8891..d4dbed5f6 100644
--- a/apt-pkg/acquire.h
+++ b/apt-pkg/acquire.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire.h,v 1.3 1998/10/22 04:56:44 jgg Exp $
+// $Id: acquire.h,v 1.4 1998/10/24 04:58:02 jgg Exp $
/* ######################################################################
Acquire - File Acquiration
@@ -105,6 +105,7 @@ class pkgAcquire::Queue
string URI;
string Description;
Item *Owner;
+ pkgAcquire::Worker *Worker;
};
// Name of the queue
@@ -121,6 +122,10 @@ class pkgAcquire::Queue
void Enqueue(Item *Owner,string URI,string Description);
void Dequeue(Item *Owner);
+ // Find a Queued item
+ QItem *FindItem(string URI,pkgAcquire::Worker *Owner);
+ bool ItemDone(QItem *Itm);
+
bool Startup();
bool Shutdown();
diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc
index 185e3400e..350b57468 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: algorithms.cc,v 1.7 1998/10/20 04:33:13 jgg Exp $
+// $Id: algorithms.cc,v 1.8 1998/10/24 04:58:04 jgg Exp $
/* ######################################################################
Algorithms - A set of misc algorithms
@@ -245,14 +245,17 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
Cache.MarkInstall(I,false);
pkgProblemResolver Fix(Cache);
-
+
// Hold back held packages.
- for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
+ if (_config->FindB("APT::Ingore-Hold",false) == false)
{
- if (I->SelectedState == pkgCache::State::Hold)
+ for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
{
- Fix.Protect(I);
- Cache.MarkKeep(I);
+ if (I->SelectedState == pkgCache::State::Hold)
+ {
+ Fix.Protect(I);
+ Cache.MarkKeep(I);
+ }
}
}
@@ -277,8 +280,9 @@ bool pkgAllUpgrade(pkgDepCache &Cache)
if (Cache[I].Install() == true)
Fix.Protect(I);
- if (I->SelectedState == pkgCache::State::Hold)
- continue;
+ if (_config->FindB("APT::Ingore-Hold",false) == false)
+ if (I->SelectedState == pkgCache::State::Hold)
+ continue;
if (I->CurrentVer != 0 && Cache[I].InstallVer != 0)
Cache.MarkInstall(I,false);
diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc
index 4882af922..68421a241 100644
--- a/apt-pkg/contrib/strutl.cc
+++ b/apt-pkg/contrib/strutl.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: strutl.cc,v 1.7 1998/10/23 00:49:59 jgg Exp $
+// $Id: strutl.cc,v 1.8 1998/10/24 04:58:07 jgg Exp $
/* ######################################################################
String Util - Some usefull string functions.
@@ -521,7 +521,7 @@ bool ReadMessages(int Fd, vector<string> &List)
End += Res;
// Look for the end of the message
- for (char *I = Buffer; I < End; I++)
+ for (char *I = Buffer; I + 1 < End; I++)
{
if (I[0] != '\n' || I[1] != '\n')
continue;
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index a0896b3dc..68c452f31 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: depcache.cc,v 1.3 1998/09/07 05:28:32 jgg Exp $
+// $Id: depcache.cc,v 1.4 1998/10/24 04:58:05 jgg Exp $
/* ######################################################################
Dependency Cache - Caches Dependency information.
@@ -673,203 +673,6 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst)
}
/*}}}*/
-#if 0
-// DepCache::ResolveConflicts - Figure the auto upgrades /*{{{*/
-// ---------------------------------------------------------------------
-/* This routine attempts to resolve conflicts generated by automatic
- upgrading. It is known as 'Stage 1' but that name isn't as proper anymore.
-
- It's most important function is during the initial load of APT. The
- loading code will mark every package for upgrade to it's candidate version
- and then call this routine. This routine will then 'soft keep' every
- package that causes conflict, is conflicted, or so on. It is a bit
- agressive in that it may unselect more packages in some odd cases
- than are strictly necessary but in the case where no packages were
- conflicting before it will always produce a system with no packages
- conflicting after.
-
- This routine is also used during state changes that require autoupgrade
- scanning. That is, if a new package is marked for install then all packages
- that have been soft kept are reconsidered for upgrade.
-
- It is called with state information about what can be un-upgraded and
- what the pre-upgrade install state was. It is expected that the caller
- has already marked the desired packages to the install state. Bit 0 is
- the original install state and Bit 1 is controls whether the package
- should be touched.
-*/
-void pkgDepCache::ResolveConflicts(unsigned char *Touched)
-{
- bool Again = false;
- do
- {
- Again = false;
- for (PkgIterator I = PkgBegin(); I.end() != true; I++)
- {
- // The package will install OK
- if ((PkgState[I->ID].DepState & DepInstMin) == DepInstMin)
- continue;
-
- /* The package was broken before and this upgrade will not
- make things better. We simply mark the package for keep
- and assume an upgrade attempt will be hopeless. This might
- not be ideal. */
- if ((Touched[I->ID] & (1 << 0)) != (1 << 0))
- {
- // The package isnt to be touched
- if ((Touched[I->ID] & (1 << 1)) == (1 << 1))
- MarkKeep(I,true);
-
- continue;
- }
-
- // Check to see if not upgrading it will solve the problem
- if (I->CurrentVer != 0)
- {
- // The package isnt to be touched
- if ((Touched[I->ID] & (1 << 1)) == (1 << 1))
- {
- if (PkgState[I->ID].Mode != ModeKeep)
- Again = true;
-
- MarkKeep(I,true);
- }
-
- /* Check if the package is sill broken. If so then we cant leave
- it as is and get a working system. Lets try marking some
- depends for 'keep'. This is brutal, it keeps everything in
- sight to fix the problem. */
- DepIterator D = I.CurrentVer().DependsList();
- for (;(PkgState[I->ID].DepState & DepInstMin) != DepInstMin &&
- D.end() != true; D++)
- {
- // We only worry about critical deps.
- if (D.IsCritical() != true)
- continue;
-
- unsigned char State = DepState[D->ID];
-
- // This dep never was set before so we dont need to set it now
- if ((State & DepNow) != DepNow)
- continue;
-
- // The dep is okay now no worries.
- if ((State & DepInstall) == DepInstall)
- continue;
-
- // Locate a target to keep
- PkgIterator P(*this);
- if (CheckDep(D,NowVersion,P) == true)
- {
- // We cant touch this package
- if ((Touched[P->ID] & (1 << 1)) == (1 << 1))
- MarkKeep(P,true);
- }
- }
- }
- }
- }
- while (Again == true);
-}
- /*}}}*/
-// DepCache::PromoteAutoKeep - Gentler version of the above /*{{{*/
-// ---------------------------------------------------------------------
-/* This is used when installing packages, all it does is attempt to promote
- everything that has been auto-kept. It simply promotes everything
- irregardless of it having a chance to work and then runs ResolveConflicts
- on the result. This allows circular depends loops to work but isn't
- terribly fast. */
-void pkgDepCache::PromoteAutoKeep()
-{
- /* Initialize the touchd array. Bit 0 is the old install state bit 1
- is the touch value */
- unsigned char *Touch = new unsigned char[Head().PackageCount];
- for (unsigned int I = 0; I != Head().PackageCount; I++)
- {
- if ((PkgState[I].DepState & DepInstMin) == DepInstMin)
- Touch[I] = 1 << 0;
- else
- Touch[I] = 0;
- }
-
- // This allows circular depends to work
- for (PkgIterator I = PkgBegin(); I.end() != true; I++)
- {
- /* It wasnt installed before or it is not autokept or it is not
- upgradeable */
- StateCache &P = PkgState[I->ID];
- if (I->CurrentVer == 0 || P.Mode != ModeKeep || I->VersionList == 0 ||
- P.CandidateVer == (Version *)I.CurrentVer() ||
- (P.iFlags & AutoKept) != AutoKept)
- continue;
-
- P.Mode = ModeInstall;
- P.InstallVer = P.CandidateVer;
- if (P.CandidateVer == (Version *)I.CurrentVer())
- P.Mode = ModeKeep;
-
- // Okay autoupgrade it.
- Touch[I->ID] |= 1 << 1;
- }
-
- Update();
- ResolveConflicts(Touch);
-
- delete [] Touch;
-}
- /*}}}*/
-// DepCache::AllUpgrade - Try to upgrade everything /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void pkgDepCache::AllUpgrade()
-{
- // Set everything to an upgrade mode
- for (PkgIterator I = PkgBegin(); I.end() != true; I++)
- {
- StateCache &State = PkgState[I->ID];
-
- /* We dont upgrade packages marked for deletion or that are
- not installed or that don't have an upgrade */
- if (State.Mode == ModeDelete || I->CurrentVer == 0 ||
- (Version *)I.CurrentVer() == State.CandidateVer)
- continue;
-
- // Set the state to upgrade
- State.iFlags = 0;
- State.Mode = ModeInstall;
- State.InstallVer = State.CandidateVer;
- if (State.CandidateVer == (Version *)I.CurrentVer())
- State.Mode = ModeKeep;
-
- // Do not upgrade things that have the hold flag set.
- if (I->SelectedState == State::Hold)
- {
- State.InstallVer = I.CurrentVer();
- State.Mode = ModeKeep;
- }
- State.Update(I,*this);
- }
-
- Update();
-
- /* Initialize the touchd array. Bit 0 is the old install state bit 1
- is the touch value */
- unsigned char *Touch = new unsigned char[Head().PackageCount];
- for (unsigned int I = 0; I != Head().PackageCount; I++)
- {
- if ((PkgState[I].DepState & DepNowMin) == DepNowMin)
- Touch[I] = (1 << 0) | (1 << 1);
- else
- Touch[I] = 1 << 1;
- }
-
- // Now downgrade everything that is broken
- ResolveConflicts(Touch);
- delete [] Touch;
-}
- /*}}}*/
-#endif
-
// StateCache::Update - Compute the various static display things /*{{{*/
// ---------------------------------------------------------------------
/* This is called whenever the Candidate version changes. */
diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc
index 50d669977..23fc344f3 100644
--- a/apt-pkg/tagfile.cc
+++ b/apt-pkg/tagfile.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: tagfile.cc,v 1.11 1998/10/02 04:39:48 jgg Exp $
+// $Id: tagfile.cc,v 1.12 1998/10/24 04:58:06 jgg Exp $
/* ######################################################################
Fast scanner for RFC-822 type header information
@@ -75,18 +75,23 @@ bool pkgTagFile::Fill()
Start = Buffer;
End = Buffer + EndSize;
- // See if only a bit of the file is left
- if (Left < Size)
+ // See if only a bit of the file is left
+ if (Left < Size - (End - Buffer))
{
if (Fd.Read(End,Left) == false)
return false;
+
End += Left;
Left = 0;
}
else
{
if (Fd.Read(End,Size - (End - Buffer)) == false)
+ {
+ cout << "boink" << endl;
return false;
+ }
+
Left -= Size - (End - Buffer);
End = Buffer + Size;
}