]> git.saurik.com Git - apt.git/blobdiff - methods/mirror.cc
* mirror method:
[apt.git] / methods / mirror.cc
index ea0fba438dfda33aafb887267fb89c2af8ca7b66..5a53d3c819fd44606f96dc03ecfb136b895c23cf 100644 (file)
@@ -125,20 +125,25 @@ bool MirrorMethod::Clean(string Dir)
 
 bool MirrorMethod::DownloadMirrorFile(string mirror_uri_str)
 {
-   if(Debug)
-      clog << "MirrorMethod::DownloadMirrorFile(): " << endl;
-
    // not that great to use pkgAcquire here, but we do not have 
    // any other way right now
    string fetch = BaseUri;
    fetch.replace(0,strlen("mirror://"),"http://");
 
+   if(Debug)
+      clog << "MirrorMethod::DownloadMirrorFile(): '" << fetch << "'"
+           << " to " << MirrorFile << endl;
+
    pkgAcquire Fetcher;
    new pkgAcqFile(&Fetcher, fetch, "", 0, "", "", "", MirrorFile);
    bool res = (Fetcher.Run() == pkgAcquire::Continue);
    if(res)
       DownloadedMirrorFile = true;
    Fetcher.Shutdown();
+
+   if(Debug)
+      clog << "MirrorMethod::DownloadMirrorFile() success: " << res << endl;
+   
    return res;
 }
 
@@ -153,11 +158,12 @@ 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;
       }
    }
@@ -168,15 +174,23 @@ void MirrorMethod::CurrentQueueUriToMirror()
 bool MirrorMethod::TryNextMirror()
 {
    // 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]);
-        if (Debug)
-           clog << "TryNextMirror: " << Queue->Uri << endl;
-        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;
+
+      // inform parent
+      UsedMirror = *nextmirror;
+      Log("Switching mirror");
+      return true;
    }
 
    if (Debug)
@@ -301,7 +315,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
@@ -322,7 +336,14 @@ bool MirrorMethod::Fetch(FetchItem *Itm)
 
 void MirrorMethod::Fail(string Err,bool Transient)
 {
-   // try the next mirror on fail
+   // 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;