]> git.saurik.com Git - apt.git/blobdiff - methods/mirror.cc
* apt-pkg/contrib/strutl.cc:
[apt.git] / methods / mirror.cc
index 56752247828ef6307b1154666a0ce45003337fbb..e8873d97b099f892c5d636d44982760ecd683d0d 100644 (file)
@@ -106,7 +106,7 @@ bool MirrorMethod::Clean(string Dir)
       for(I=list.begin(); I != list.end(); I++)
       {
         string uri = (*I)->GetURI();
-        if(uri.substr(0,strlen("mirror://")) != string("mirror://"))
+        if(uri.find("mirror://") != 0)
            continue;
         string BaseUri = uri.substr(0,uri.size()-1);
         if (URItoFileName(BaseUri) == Dir->d_name)
@@ -153,33 +153,40 @@ void MirrorMethod::CurrentQueueUriToMirror()
       return;
 
    // find current mirror and select next one
-   for (int i=0; i < AllMirrors.size(); i++) 
+   for (vector<string>::const_iterator mirror = AllMirrors.begin();
+       mirror != AllMirrors.end(); ++mirror)
    {
-      if (Queue->Uri.find(AllMirrors[i]) == 0)
+      if (Queue->Uri.find(*mirror) == 0)
       {
-        Queue->Uri.replace(0, AllMirrors[i].size(), BaseUri);
+        Queue->Uri.replace(0, mirror->length(), BaseUri);
         return;
       }
    }
    _error->Error("Internal error: Failed to convert %s back to %s",
-                Queue->Uri, BaseUri);
+                Queue->Uri.c_str(), BaseUri.c_str());
 }
 
 bool MirrorMethod::TryNextMirror()
 {
-   if(Debug)
-      cerr << "using mirror: " << Mirror << endl;
-
    // find current mirror and select next one
-   for (int i=0; i < AllMirrors.size()-1; i++) 
+   for (vector<string>::const_iterator mirror = AllMirrors.begin();
+       mirror != AllMirrors.end(); ++mirror)
    {
-      if (Queue->Uri.find(AllMirrors[i]) == 0)
-      {
-        Queue->Uri.replace(0, AllMirrors[i].size(), AllMirrors[i+1]);
-        return true;
-      }
+      if (Queue->Uri.find(*mirror) != 0)
+        continue;
+
+      vector<string>::const_iterator nextmirror = mirror + 1;
+      if (nextmirror != AllMirrors.end())
+        break;
+      Queue->Uri.replace(0, mirror->length(), *nextmirror);
+      if (Debug)
+        clog << "TryNextMirror: " << Queue->Uri << endl;
+      return true;
    }
 
+   if (Debug)
+      clog << "TryNextMirror could not find another mirror to try" << endl;
+
    return false;
 }
 
@@ -299,7 +306,7 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
       DownloadMirrorFile(Itm->Uri);
    }
 
-   if(Mirror.empty()) {
+   if(AllMirrors.empty()) {
       if(!InitMirrors()) {
         // no valid mirror selected, something went wrong downloading
         // from the master mirror site most likely and there is
@@ -307,15 +314,12 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
         return false;
       }
    }
-   if(Debug)
-      clog << "selected mirror: " << Mirror << endl;
 
+   if(Itm->Uri.find("mirror://") != string::npos)
+      Itm->Uri.replace(0,BaseUri.size(), Mirror);
 
-   for (FetchItem *I = Queue; I != 0; I = I->Next)
-   {
-      if(I->Uri.find("mirror://") != string::npos)
-        I->Uri.replace(0,BaseUri.size(), Mirror);
-   }
+   if(Debug)
+      clog << "Fetch: " << Itm->Uri << endl << endl;
    
    // now run the real fetcher
    return HttpMethod::Fetch(Itm);
@@ -323,8 +327,15 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
 
 void MirrorMethod::Fail(string Err,bool Transient)
 {
-   // try the next mirror on fail
-   if (TryNextMirror()) 
+   // FIXME: TryNextMirror is not ideal for indexfile as we may
+   //        run into auth issues
+
+   if (Debug)
+      clog << "Failure to get " << Queue->Uri << endl;
+
+   // try the next mirror on fail (if its not a expected failure,
+   // e.g. translations are ok to ignore)
+   if (!Queue->FailIgnore && TryNextMirror()) 
       return;
 
    // all mirrors failed, so bail out