* be more clever about I-M-S hits for the Release file and gpg-failures with it,...
authorMichael Vogt <michael.vogt@ubuntu.com>
Thu, 5 Jan 2006 21:11:29 +0000 (21:11 +0000)
committerMichael Vogt <michael.vogt@ubuntu.com>
Thu, 5 Jan 2006 21:11:29 +0000 (21:11 +0000)
apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
debian/changelog

index 1c5866a..b9fc744 100644 (file)
@@ -430,7 +430,7 @@ pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire *Owner,
                                 const vector<struct IndexTarget*>* IndexTargets,
                                 indexRecords* MetaIndexParser) :
    Item(Owner), RealURI(URI), SigFile(SigFile), AuthPass(false),
-   MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets)
+   MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets), IMSHit(false)
 {
    DestFile = _config->FindDir("Dir::State::lists") + "partial/";
    DestFile += URItoFileName(URI);
@@ -523,6 +523,9 @@ void pkgAcqMetaIndex::RetrievalDone(string Message)
       return;
    }
 
+   // see if the download was a IMSHit
+   IMSHit = StringToBool(LookupTag(Message,"IMS-Hit"),false);
+
    Complete = true;
 
    string FinalFile = _config->FindDir("Dir::State::lists");
@@ -688,10 +691,30 @@ void pkgAcqMetaIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
    if (AuthPass == true)
    {
-      // gpgv method failed
+      // if we fail the authentication but got the file via a IMS-Hit 
+      // this means that the file wasn't downloaded and that it might be
+      // just stale (server problem, proxy etc). we delete what we have
+      // queue it again without i-m-s 
+      // alternatively we could just unlink the file and let the user try again
+      if (IMSHit)
+      {
+        Complete = false;
+        Local = false;
+        AuthPass = false;
+        unlink(DestFile.c_str());
+
+        DestFile = _config->FindDir("Dir::State::lists") + "partial/";
+        DestFile += URItoFileName(RealURI);
+        Desc.URI = RealURI;
+        QueueURI(Desc);
+        return;
+      }
+
+      // gpgv method failed 
       _error->Warning("GPG error: %s: %s",
                       Desc.Description.c_str(),
                       LookupTag(Message,"Message").c_str());
+
    }
 
    // No Release file was present, or verification failed, so fall
index c34b5ef..e6fc7fc 100644 (file)
@@ -151,6 +151,7 @@ class pkgAcqMetaIndex : public pkgAcquire::Item
    const vector<struct IndexTarget*>* IndexTargets;
    indexRecords* MetaIndexParser;
    bool AuthPass;
+   bool IMSHit; // required to fail gracefully on failures
 
    bool VerifyVendor();
    void RetrievalDone(string Message);
index e6681c4..5c1b134 100644 (file)
@@ -15,6 +15,7 @@ apt (0.6.43.1) unstable; urgency=low
   * apt-get source won't download already downloaded files again
     (closes: #79277)
   * share/debian-archive.gpg: new 2006 ftp-archive signing key added
+  * redownload the Release file if IMS-Hit and gpg failure
 
  --