// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire-item.cc,v 1.18 1999/01/24 21:16:04 jgg Exp $
+// $Id: acquire-item.cc,v 1.23 1999/02/01 08:11:57 jgg Exp $
/* ######################################################################
Acquire Item - Item to acquire
#include <apt-pkg/acquire-item.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/error.h>
-#include <strutl.h>
+#include <apt-pkg/strutl.h>
#include <sys/stat.h>
#include <unistd.h>
// ---------------------------------------------------------------------
/* We return to an idle state if there are still other queues that could
fetch this object */
-void pkgAcquire::Item::Failed(string Message)
+void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
{
Status = StatIdle;
ErrorText = LookupTag(Message,"Message");
if (QueueCounter <= 1)
{
/* This indicates that the file is not available right now but might
- be sometime later. If we do a retry cycle then this should be
- retried */
- if (StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
+ be sometime later. If we do a retry cycle then this should be
+ retried [CDROMs] */
+ if (Cnf->LocalOnly == true &&
+ StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
{
Status = StatIdle;
- Owner->Dequeue(this);
+ Dequeue();
return;
}
Status = StatError;
- Owner->Dequeue(this);
+ Dequeue();
}
}
/*}}}*/
// Acquire::Item::Start - Item has begun to download /*{{{*/
// ---------------------------------------------------------------------
-/* */
+/* Stash status and the file size. Note that setting Complete means
+ sub-phases of the acquire process such as decompresion are operating */
void pkgAcquire::Item::Start(string Message,unsigned long Size)
{
Status = StatFetching;
return Location->ReleaseURI();
}
/*}}}*/
+// AcqIndexRel::Failed - Silence failure messages for missing rel files /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void pkgAcqIndexRel::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
+{
+ // This is the retry counter
+ if (Cnf->LocalOnly == true ||
+ StringToBool(LookupTag(Message,"Transient-Failure"),false) == false)
+ {
+ Status = StatIdle;
+ Dequeue();
+ return;
+ }
+
+ Item::Failed(Message,Cnf);
+}
+ /*}}}*/
// AcqArchive::AcqArchive - Constructor /*{{{*/
// ---------------------------------------------------------------------
-/* */
+/* This just sets up the initial fetch environment and queues the first
+ possibilitiy */
pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
pkgRecords *Recs,pkgCache::VerIterator const &Version,
string &StoreFilename) :
Item(Owner), Version(Version), Sources(Sources), Recs(Recs),
StoreFilename(StoreFilename), Vf(Version.FileList())
{
+ Retries = _config->FindI("Acquire::Retries",0);
+
+ // Generate the final file name as: package_version_arch.deb
+ StoreFilename = QuoteString(Version.ParentPkg().Name(),"_:") + '_' +
+ QuoteString(Version.VerStr(),"_:") + '_' +
+ QuoteString(Version.Arch(),"_:.") + ".deb";
+
// Select a source
if (QueueNext() == false && _error->PendingError() == false)
_error->Error("I wasn't able to locate file for the %s package. "
/*}}}*/
// AcqArchive::QueueNext - Queue the next file source /*{{{*/
// ---------------------------------------------------------------------
-/* This queues the next available file version for download. */
+/* This queues the next available file version for download. It checks if
+ the archive is already available in the cache and stashs the MD5 for
+ checking later. */
bool pkgAcqArchive::QueueNext()
{
for (; Vf.end() == false; Vf++)
"field for package %s."
,Version.ParentPkg().Name());
- // See if we already have the file.
+ // See if we already have the file. (Legacy filenames)
FileSize = Version->Size;
string FinalFile = _config->FindDir("Dir::Cache::Archives") + flNotDir(PkgFile);
struct stat Buf;
happen.. */
unlink(FinalFile.c_str());
}
-
- DestFile = _config->FindDir("Dir::Cache::Archives") + "partial/" + flNotDir(PkgFile);
+
+ // Check it again using the new style output filenames
+ FinalFile = _config->FindDir("Dir::Cache::Archives") + flNotDir(StoreFilename);
+ if (stat(FinalFile.c_str(),&Buf) == 0)
+ {
+ // Make sure the size matches
+ if ((unsigned)Buf.st_size == Version->Size)
+ {
+ Complete = true;
+ Local = true;
+ Status = StatDone;
+ StoreFilename = DestFile = FinalFile;
+ return true;
+ }
+
+ /* Hmm, we have a file and its size does not match, this shouldnt
+ happen.. */
+ unlink(FinalFile.c_str());
+ }
+
+ DestFile = _config->FindDir("Dir::Cache::Archives") + "partial/" + flNotDir(StoreFilename);
// Create the item
Desc.URI = Location->ArchiveURI(PkgFile);
// Done, move it into position
string FinalFile = _config->FindDir("Dir::Cache::Archives");
- FinalFile += flNotDir(DestFile);
+ FinalFile += flNotDir(StoreFilename);
Rename(DestFile,FinalFile);
StoreFilename = DestFile = FinalFile;
// AcqArchive::Failed - Failure handler /*{{{*/
// ---------------------------------------------------------------------
/* Here we try other sources */
-void pkgAcqArchive::Failed(string Message)
+void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
{
ErrorText = LookupTag(Message,"Message");
if (QueueNext() == false)
- Item::Failed(Message);
+ {
+ // This is the retry counter
+ if (Retries != 0 &&
+ Cnf->LocalOnly == false &&
+ StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
+ {
+ Retries--;
+ Vf = Version.FileList();
+ if (QueueNext() == true)
+ return;
+ }
+
+ Item::Failed(Message,Cnf);
+ }
}
/*}}}*/