]> git.saurik.com Git - apt.git/commitdiff
* merged the apt--mirror branch
authorMichael Vogt <michael.vogt@ubuntu.com>
Tue, 6 Feb 2007 14:04:47 +0000 (15:04 +0100)
committerMichael Vogt <michael.vogt@ubuntu.com>
Tue, 6 Feb 2007 14:04:47 +0000 (15:04 +0100)
21 files changed:
apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
apt-pkg/acquire-method.cc
apt-pkg/acquire-method.h
apt-pkg/init.cc
cmdline/apt-report-mirror-failure [new file with mode: 0755]
cmdline/makefile
configure.in
debian/apt.dirs
debian/changelog
debian/rules
doc/examples/configure-index
methods/connect.cc
methods/http.cc
methods/http.h
methods/http_main.cc [new file with mode: 0644]
methods/makefile
methods/mirror.cc [new file with mode: 0644]
methods/mirror.h [new file with mode: 0644]
mirror-failure.py [new file with mode: 0644]
po/apt-all.pot

index 94288a1321a3b5306a70bb6ceded729a1ce5e9f4..3be7878bf58f307266ba116163d94de75d4bfc64 100644 (file)
@@ -63,6 +63,7 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
    Status = StatIdle;
    ErrorText = LookupTag(Message,"Message");
+   UsedMirror =  LookupTag(Message,"UsedMirror");
    if (QueueCounter <= 1)
    {
       /* This indicates that the file is not available right now but might
@@ -79,6 +80,13 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
       Status = StatError;
       Dequeue();
    }   
+   
+   // report mirror failure back to LP if we actually use a mirror
+   string FailReason = LookupTag(Message, "FailReason");
+   if(FailReason.size() != 0)
+      ReportMirrorFailure(FailReason);
+   else
+      ReportMirrorFailure(ErrorText);
 }
                                                                        /*}}}*/
 // Acquire::Item::Start - Item has begun to download                   /*{{{*/
@@ -100,6 +108,7 @@ void pkgAcquire::Item::Done(string Message,unsigned long Size,string,
 {
    // We just downloaded something..
    string FileName = LookupTag(Message,"Filename");
+   UsedMirror =  LookupTag(Message,"UsedMirror");
    if (Complete == false && FileName == DestFile)
    {
       if (Owner->Log != 0)
@@ -108,7 +117,6 @@ void pkgAcquire::Item::Done(string Message,unsigned long Size,string,
 
    if (FileSize == 0)
       FileSize= Size;
-   
    Status = StatDone;
    ErrorText = string();
    Owner->Dequeue(this);
@@ -131,6 +139,49 @@ void pkgAcquire::Item::Rename(string From,string To)
 }
                                                                        /*}}}*/
 
+void pkgAcquire::Item::ReportMirrorFailure(string FailCode)
+{
+   // we only act if a mirror was used at all
+   if(UsedMirror.empty())
+      return;
+#if 0
+   std::cerr << "\nReportMirrorFailure: " 
+            << UsedMirror
+            << " Uri: " << DescURI()
+            << " FailCode: " 
+            << FailCode << std::endl;
+#endif
+   const char *Args[40];
+   unsigned int i = 0;
+   string report = _config->Find("Methods::Mirror::ProblemReporting", 
+                                "/usr/lib/apt/apt-report-mirror-failure");
+   if(!FileExists(report))
+      return;
+   Args[i++] = report.c_str();
+   Args[i++] = UsedMirror.c_str();
+   Args[i++] = DescURI().c_str();
+   Args[i++] = FailCode.c_str();
+   Args[i++] = NULL;
+   pid_t pid = ExecFork();
+   if(pid < 0) 
+   {
+      _error->Error("ReportMirrorFailure Fork failed");
+      return;
+   }
+   else if(pid == 0) 
+   {
+      execvp(Args[0], (char**)Args);
+      std::cerr << "Could not exec " << Args[0] << std::endl;
+      _exit(100);
+   }
+   if(!ExecWait(pid, "report-mirror-failure")) 
+   {
+      _error->Warning("Couldn't report problem to '%s'",
+                     _config->Find("Methods::Mirror::ProblemReporting").c_str());
+   }
+}
+
+
 // AcqIndex::AcqIndex - Constructor                                    /*{{{*/
 // ---------------------------------------------------------------------
 /* The package file is added to the queue and a second class is 
@@ -176,7 +227,6 @@ string pkgAcqIndex::Custom600Headers()
    struct stat Buf;
    if (stat(Final.c_str(),&Buf) != 0)
       return "\nIndex-File: true";
-   
    return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
 }
                                                                        /*}}}*/
@@ -235,6 +285,7 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5,
          Status = StatAuthError;
          ErrorText = _("MD5Sum mismatch");
          Rename(DestFile,DestFile + ".FAILED");
+        ReportMirrorFailure("HashChecksumFailure");
          return;
       }
       // Done, move it into position
@@ -757,6 +808,7 @@ void pkgAcqMetaIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
       }
 
       // gpgv method failed 
+      ReportMirrorFailure("GPGFailure");
       _error->Warning("GPG error: %s: %s",
                       Desc.Description.c_str(),
                       LookupTag(Message,"Message").c_str());
index 3a0a690e1e86fe3c255619b82094b5230b08ebed..f659bb459d850e035a35f8e44bde2ff1815492a4 100644 (file)
@@ -57,6 +57,7 @@ class pkgAcquire::Item
    unsigned long ID;
    bool Complete;
    bool Local;
+   string UsedMirror;
 
    // Number of queues we are inserted into
    unsigned int QueueCounter;
@@ -79,6 +80,9 @@ class pkgAcquire::Item
    pkgAcquire *GetOwner() {return Owner;};
    virtual bool IsTrusted() {return false;};
    
+   // report mirror problems
+   void ReportMirrorFailure(string FailCode);
+
    Item(pkgAcquire *Owner);
    virtual ~Item();
 };
index 41b832f3babe7fc106caec319ed6daf35e39e7f6..180b52ad7bd689de2215834c85051578bae4d108 100644 (file)
@@ -99,12 +99,11 @@ void pkgAcqMethod::Fail(string Err,bool Transient)
    }
    
    char S[1024];
+   char *End = S;
    if (Queue != 0)
    {
-      snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: %s\n"
-              "Message: %s %s\n",Queue->Uri.c_str(),Err.c_str(),
-              FailExtra.c_str());
-
+      End += snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: %s\n"
+                     "Message: %s %s\n",Queue->Uri.c_str(), Err.c_str(), IP.c_str());
       // Dequeue
       FetchItem *Tmp = Queue;
       Queue = Queue->Next;
@@ -113,10 +112,14 @@ void pkgAcqMethod::Fail(string Err,bool Transient)
         QueueBack = Queue;
    }
    else
-      snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: <UNKNOWN>\n"
-              "Message: %s %s\n",Err.c_str(),
-              FailExtra.c_str());
-      
+   {
+      End += snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: <UNKNOWN>\n"
+                     "Message: %s\n",Err.c_str());
+   }
+   if(FailReason.empty() == false)
+      End += snprintf(End,sizeof(S)-50 - (End - S),"FailReason: %s\n",FailReason.c_str());
+   if (UsedMirror.empty() == false)
+      End += snprintf(End,sizeof(S)-50 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str());
    // Set the transient flag 
    if (Transient == true)
       strcat(S,"Transient-Failure: true\n\n");
@@ -182,6 +185,8 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
       End += snprintf(End,sizeof(S)-50 - (End - S),"MD5-Hash: %s\n",Res.MD5Sum.c_str());
    if (Res.SHA1Sum.empty() == false)
       End += snprintf(End,sizeof(S)-50 - (End - S),"SHA1-Hash: %s\n",Res.SHA1Sum.c_str());
+   if (UsedMirror.empty() == false)
+      End += snprintf(End,sizeof(S)-50 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str());
    if (Res.GPGVOutput.size() > 0)
       End += snprintf(End,sizeof(S)-50 - (End - S),"GPGVOutput:\n");     
    for (vector<string>::iterator I = Res.GPGVOutput.begin();
index f46209d12823aabccbdef8bf7278402a52e207bf..20691cc2c3997d2c3419867eeb39ae5d69899aa8 100644 (file)
@@ -54,7 +54,9 @@ class pkgAcqMethod
    vector<string> Messages;
    FetchItem *Queue;
    FetchItem *QueueBack;
-   string FailExtra;
+   string FailReason;
+   string UsedMirror;
+   string IP;
    
    // Handlers for messages
    virtual bool Configuration(string Message);
@@ -63,14 +65,14 @@ class pkgAcqMethod
    // Outgoing messages
    void Fail(bool Transient = false);
    inline void Fail(const char *Why, bool Transient = false) {Fail(string(Why),Transient);};
-   void Fail(string Why, bool Transient = false);
-   void URIStart(FetchResult &Res);
-   void URIDone(FetchResult &Res,FetchResult *Alt = 0);
+   virtual void Fail(string Why, bool Transient = false);
+   virtual void URIStart(FetchResult &Res);
+   virtual void URIDone(FetchResult &Res,FetchResult *Alt = 0);
+
    bool MediaFail(string Required,string Drive);
    virtual void Exit() {};
 
    public:
-
    enum CnfFlags {SingleInstance = (1<<0),
                   Pipeline = (1<<1), SendConfig = (1<<2),
                   LocalOnly = (1<<3), NeedsCleanup = (1<<4), 
@@ -80,7 +82,8 @@ class pkgAcqMethod
    void Status(const char *Format,...);
    
    int Run(bool Single = false);
-   inline void SetFailExtraMsg(string Msg) {FailExtra = Msg;};
+   inline void SetFailReason(string Msg) {FailReason = Msg;};
+   inline void SetIP(string aIP) {IP = aIP;};
    
    pkgAcqMethod(const char *Ver,unsigned long Flags = 0);
    virtual ~pkgAcqMethod() {};
index 579a19ab9ee1c5184a608685ba57d3db2671df27..0be0aee9848dae7a2233aa8ac2ac4a2cfd618396 100644 (file)
@@ -56,6 +56,7 @@ bool pkgInitConfig(Configuration &Cnf)
        
    Cnf.Set("Dir::State::lists","lists/");
    Cnf.Set("Dir::State::cdroms","cdroms.list");
+   Cnf.Set("Dir::State::mirrors","mirrors/");
    
    // Cache
    Cnf.Set("Dir::Cache","var/cache/apt/");
diff --git a/cmdline/apt-report-mirror-failure b/cmdline/apt-report-mirror-failure
new file mode 100755 (executable)
index 0000000..1567e78
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/python
+
+import sys
+import urllib
+import apt_pkg
+
+apt_pkg.init()
+url = apt_pkg.Config.Find("Acquire::Mirror::ReportFailures", None)
+                          #"http://people.ubuntu.com:9000/mirror-failure")
+                          #"http://localhost:9000/mirror-failure")
+if not url:
+    sys.exit(0)
+
+print "Reporting mirror failure to '%s'" % url
+
+data = {}
+data['mirror'] = sys.argv[1]
+data['failurl'] = sys.argv[2]
+data['error'] = sys.argv[3]
+f = urllib.urlopen(url, urllib.urlencode(data))
+f.read()
+f.close()
+
+
index 49035be4493c8d08d3a2d1ac63ea4cd13d4418aa..2a5bdfbea2cd8a8c94bfe8105cdcbb565e2d8ef9 100644 (file)
@@ -58,3 +58,9 @@ SOURCE=apt-mark
 TO=$(BIN)
 TARGET=program
 include $(COPY_H)
+
+# The apt-key program
+SOURCE=apt-report-mirror-failure
+TO=$(BIN)
+TARGET=program
+include $(COPY_H)
index 67841b3ef75b71b5c76766f53d7f60475ba0143a..ce166b31e64852e072764972c9c760c163b26a4a 100644 (file)
@@ -18,7 +18,7 @@ AC_CONFIG_AUX_DIR(buildlib)
 AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in)
 
 dnl -- SET THIS TO THE RELEASE VERSION --
-AC_DEFINE_UNQUOTED(VERSION,"0.6.46.4ubuntu6")
+AC_DEFINE_UNQUOTED(VERSION,"0.6.46.4ubuntu7")
 PACKAGE="apt"
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_SUBST(PACKAGE)
index 1543e8bb1944727b36cb782e5637b48bed64c788..025898e84ac4d6e8583da9b22f7e9b854b1ba31b 100644 (file)
@@ -6,5 +6,6 @@ etc/apt/apt.conf.d
 etc/apt/sources.list.d
 var/cache/apt/archives/partial
 var/lib/apt/lists/partial
+var/lib/apt/mirrors/partial
 var/lib/apt/periodic
 usr/share/bug/apt
index 8385671836a01464748835497ab875a5abee7bfa..6fdf646f00ced51a17a0c8c6a8b30bec708deef2 100644 (file)
@@ -1,3 +1,15 @@
+apt (0.6.46.4ubuntu7) feisty; urgency=low
+
+  * Merged the apt--mirror branch. This means that a new 'mirror' 
+    method is available that will allow dynamic mirror updates.
+    The sources.list entry looks something like this:
+    "deb mirror://mirrors.lp.net/get_mirror feisty main restricted"
+
+    It also supports error reporting to a configurable url for mirror
+    problems/failures.
+
+ -- Michael Vogt <michael.vogt@ubuntu.com>  Tue,  6 Feb 2007 11:38:06 +0100
+
 apt (0.6.46.4ubuntu6) feisty; urgency=low
 
   * methods/http.cc:
index b22b09fd15ca021bbf867be033ce38791677fff1..3defd3c29e78ba540f4cbfa978d6e15e5a57b37b 100755 (executable)
@@ -219,6 +219,10 @@ apt: build debian/shlibs.local
        rm -f build/po/*.pot
        rm -f po/*.pot
 
+       # move the mirror failure script in place
+       mv debian/$@/usr/bin/apt-report-mirror-failure \
+          debian/$@/usr/lib/apt/apt-report-mirror-failure \
+
        dh_installexamples -p$@ $(BLD)/docs/examples/*
        dh_installman -p$@ 
        dh_installcron -p$@
index 26d9354fe9b70ded546fc943f9929f082a21fca2..4262b479f1589a7c50b339641b37d196ea638365 100644 (file)
@@ -180,6 +180,17 @@ Acquire
   {
    Options {"--ignore-time-conflict";} // not very usefull on a normal system
   };
+
+  mirror
+  {
+   RefreshInterval "360"; // refresh interval in minutes
+   MaxAge "90";           // max age for a mirror file in days before 
+                          // it gets deleted
+   // mirror failure reporting script
+   ProblemReporting "/usr/lib/apt/apt-report-mirror-failure"; 
+   // mirror failure reporting url
+   ReportFailures "http://example.com/mirror-failure"; 
+  };
 };
 
 // Directory layout
@@ -193,6 +204,7 @@ Dir "/"
      userstatus "status.user";
      status "/var/lib/dpkg/status";
      cdroms "cdroms.list";
+     mirrors "mirrors/";
   };
   
   // Location of the cache dir
@@ -283,9 +295,9 @@ Debug
   Acquire::Http "false";   // Show http command traffic
   Acquire::Https "false";   // Show https debug
   Acquire::gpgv "false";   // Show the gpgv traffic
+  Acquire::Mirror "false"; // Show debugging of the mirror method
   aptcdrom "false";        // Show found package files
   IdentCdrom "false";
-  
 }
 
 /* Whatever you do, do not use this configuration file!! Take out ONLY
index 8c2ac6d56dab4451b41ba0208297cad60c40fbe1..145001fb37c2aa637cfaecca46b944a0acc2b001 100644 (file)
@@ -18,6 +18,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <unistd.h>
+#include <sstream>
 
 // Internet stuff
 #include <netinet/in.h>
@@ -67,12 +68,10 @@ static bool DoConnect(struct addrinfo *Addr,string Host,
       wrong this will get tacked onto the end of the error message */
    if (LastHostAddr->ai_next != 0)
    {
-      char Name2[NI_MAXHOST + NI_MAXSERV + 10];
-      snprintf(Name2,sizeof(Name2),_("[IP: %s %s]"),Name,Service);
-      Owner->SetFailExtraMsg(string(Name2));
-   }   
-   else
-      Owner->SetFailExtraMsg("");
+      std::stringstream ss;
+      ioprintf(ss, _("[IP: %s %s]"),Name,Service);
+      Owner->SetIP(ss.str());
+   }
       
    // Get a socket
    if ((Fd = socket(Addr->ai_family,Addr->ai_socktype,
@@ -89,7 +88,7 @@ static bool DoConnect(struct addrinfo *Addr,string Host,
    /* This implements a timeout for connect by opening the connection
       nonblocking */
    if (WaitFd(Fd,true,TimeOut) == false) {
-      Owner->SetFailExtraMsg("\nFailReason: Timeout");
+      Owner->SetFailReason("Timeout");
       return _error->Error(_("Could not connect to %s:%s (%s), "
                           "connection timed out"),Host.c_str(),Service,Name);
    }
@@ -104,7 +103,7 @@ static bool DoConnect(struct addrinfo *Addr,string Host,
    {
       errno = Err;
       if(errno == ECONNREFUSED)
-         Owner->SetFailExtraMsg("\nFailReason: ConnectionRefused");
+         Owner->SetFailReason("ConnectionRefused");
       return _error->Errno("connect",_("Could not connect to %s:%s (%s)."),Host.c_str(),
                           Service,Name);
    }
@@ -164,12 +163,13 @@ bool Connect(string Host,int Port,const char *Service,int DefPort,int &Fd,
                  DefPort = 0;
                  continue;
               }
+              Owner->SetFailReason("ResolveFailure");
               return _error->Error(_("Could not resolve '%s'"),Host.c_str());
            }
            
            if (Res == EAI_AGAIN)
            {
-              Owner->SetFailExtraMsg("\nFailReason: TmpResolveFailure");
+              Owner->SetFailReason("TmpResolveFailure");
               return _error->Error(_("Temporary failure resolving '%s'"),
                                    Host.c_str());
            }
index 0eef7a633a9aa9f1d0f8b2cb26e21f703b9f5b10..ecfb80bd2e3a451d3264b061e4c1fdf86f32e775 100644 (file)
@@ -38,7 +38,6 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
-#include <iostream>
 #include <apti18n.h>
 
 // Internet stuff
@@ -58,7 +57,7 @@ time_t HttpMethod::FailTime = 0;
 unsigned long PipelineDepth = 10;
 unsigned long TimeOut = 120;
 bool Debug = false;
-
+URI Proxy;
 
 unsigned long CircleBuf::BwReadLimit=0;
 unsigned long CircleBuf::BwTickReadData=0;
@@ -916,6 +915,9 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
       failure */
    if (Srv->Result < 200 || Srv->Result >= 300)
    {
+      char err[255];
+      snprintf(err,sizeof(err)-1,"HttpError%i",Srv->Result);
+      SetFailReason(err);
       _error->Error("%u %s",Srv->Result,Srv->Code);
       if (Srv->HaveContent == true)
         return 4;
@@ -991,7 +993,7 @@ void HttpMethod::SigTerm(int)
    depth. */
 bool HttpMethod::Fetch(FetchItem *)
 {
-   if (Server == 0)
+   if (Server == 0) 
       return true;
 
    // Queue the requests
@@ -1224,13 +1226,5 @@ int HttpMethod::Loop()
 }
                                                                        /*}}}*/
 
-int main()
-{
-   setlocale(LC_ALL, "");
-
-   HttpMethod Mth;
-   
-   return Mth.Loop();
-}
 
 
index 541e2952cb5fdf540f31129e99ad7e499fc074ef..5eac1140105796546a5031fcb37fe9f2c7123337 100644 (file)
@@ -13,7 +13,7 @@
 
 #define MAXLEN 360
 
-#include <iostream>
+
 
 using std::cout;
 using std::endl;
@@ -134,7 +134,6 @@ class HttpMethod : public pkgAcqMethod
    bool ServerDie(ServerState *Srv);
    int DealWithHeaders(FetchResult &Res,ServerState *Srv);
 
-   virtual bool Fetch(FetchItem *);
    virtual bool Configuration(string Message);
    
    // In the event of a fatal signal this file will be closed and timestamped.
@@ -142,6 +141,9 @@ class HttpMethod : public pkgAcqMethod
    static int FailFd;
    static time_t FailTime;
    static void SigTerm(int);
+
+   protected:
+   virtual bool Fetch(FetchItem *);
    
    public:
    friend class ServerState;
@@ -158,6 +160,5 @@ class HttpMethod : public pkgAcqMethod
    };
 };
 
-URI Proxy;
 
 #endif
diff --git a/methods/http_main.cc b/methods/http_main.cc
new file mode 100644 (file)
index 0000000..2c46ab1
--- /dev/null
@@ -0,0 +1,15 @@
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/acquire-method.h>
+
+#include "connect.h"
+#include "rfc2553emu.h"
+#include "http.h"
+
+
+int main()
+{
+   setlocale(LC_ALL, "");
+
+   HttpMethod Mth;
+   return Mth.Loop();
+}
index 197ddf9ed093e250c1025c35d28a3d14f6220b05..f971e56e8dbe7e442160ab2546821bee26c23b0f 100644 (file)
@@ -49,7 +49,7 @@ include $(PROGRAM_H)
 PROGRAM=http
 SLIBS = -lapt-pkg $(SOCKETLIBS)
 LIB_MAKES = apt-pkg/makefile
-SOURCE = http.cc rfc2553emu.cc connect.cc
+SOURCE = http.cc http_main.cc rfc2553emu.cc connect.cc
 include $(PROGRAM_H)
 
 # The https method
@@ -73,6 +73,13 @@ LIB_MAKES = apt-pkg/makefile
 SOURCE = rsh.cc
 include $(PROGRAM_H)
 
+# The mirror method
+PROGRAM=mirror
+SLIBS = -lapt-pkg $(SOCKETLIBS)
+LIB_MAKES = apt-pkg/makefile
+SOURCE = mirror.cc http.cc rfc2553emu.cc connect.cc
+include $(PROGRAM_H)
+
 # SSH and vzip2 method symlink
 binary: $(BIN)/ssh $(BIN)/bzip2
 veryclean: clean-$(BIN)/ssh clean-$(BIN)/bzip2
diff --git a/methods/mirror.cc b/methods/mirror.cc
new file mode 100644 (file)
index 0000000..9fe64fd
--- /dev/null
@@ -0,0 +1,282 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: mirror.cc,v 1.59 2004/05/08 19:42:35 mdz Exp $
+/* ######################################################################
+
+   Mirror Aquire Method - This is the Mirror aquire method for APT.
+   
+   ##################################################################### */
+                                                                       /*}}}*/
+// Include Files                                                       /*{{{*/
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/acquire-method.h>
+#include <apt-pkg/acquire-item.h>
+#include <apt-pkg/acquire.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/hashes.h>
+#include <apt-pkg/sourcelist.h>
+
+#include <fstream>
+#include <iostream>
+#include <stdarg.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+using namespace std;
+
+#include "mirror.h"
+#include "http.h"
+#include "apti18n.h"
+                                                                       /*}}}*/
+
+/* Done:
+ * - works with http (only!)
+ * - always picks the first mirror from the list
+ * - call out to problem reporting script
+ * - supports "deb mirror://host/path/to/mirror-list/// dist component"
+ * - uses pkgAcqMethod::FailReason() to have a string representation
+ *   of the failure that is also send to LP
+ * 
+ * TODO: 
+ * - deal with runing as non-root because we can't write to the lists 
+     dir then -> use the cached mirror file
+ * - better method to download than having a pkgAcquire interface here
+ *   and better error handling there!
+ * - support more than http
+ * - testing :)
+ */
+
+MirrorMethod::MirrorMethod()
+   : HttpMethod(), HasMirrorFile(false)
+{
+};
+
+// HttpMethod::Configuration - Handle a configuration message          /*{{{*/
+// ---------------------------------------------------------------------
+/* We stash the desired pipeline depth */
+bool MirrorMethod::Configuration(string Message)
+{
+   if (pkgAcqMethod::Configuration(Message) == false)
+      return false;
+   Debug = _config->FindB("Debug::Acquire::mirror",false);
+   
+   return true;
+}
+                                                                       /*}}}*/
+
+// clean the mirrors dir based on ttl information
+bool MirrorMethod::Clean(string Dir)
+{
+   vector<metaIndex *>::const_iterator I;
+
+   if(Debug)
+      clog << "MirrorMethod::Clean(): " << Dir << endl;
+
+   // read sources.list
+   pkgSourceList list;
+   list.ReadMainList();
+
+   DIR *D = opendir(Dir.c_str());   
+   if (D == 0)
+      return _error->Errno("opendir",_("Unable to read %s"),Dir.c_str());
+   
+   string StartDir = SafeGetCWD();
+   if (chdir(Dir.c_str()) != 0)
+   {
+      closedir(D);
+      return _error->Errno("chdir",_("Unable to change to %s"),Dir.c_str());
+   }
+   
+   for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D))
+   {
+      // Skip some files..
+      if (strcmp(Dir->d_name,"lock") == 0 ||
+         strcmp(Dir->d_name,"partial") == 0 ||
+         strcmp(Dir->d_name,".") == 0 ||
+         strcmp(Dir->d_name,"..") == 0)
+        continue;
+
+      // see if we have that uri
+      for(I=list.begin(); I != list.end(); I++)
+      {
+        string uri = (*I)->GetURI();
+        if(uri.substr(0,strlen("mirror://")) != string("mirror://"))
+           continue;
+        string BaseUri = uri.substr(0,uri.size()-1);
+        if (URItoFileName(BaseUri) == Dir->d_name)
+           break;
+      }
+      // nothing found, nuke it
+      if (I == list.end())
+        unlink(Dir->d_name);
+   };
+   
+   chdir(StartDir.c_str());
+   closedir(D);
+   return true;   
+}
+
+
+bool MirrorMethod::GetMirrorFile(string mirror_uri_str)
+{
+   /* 
+    - a mirror_uri_str looks like this:
+    mirror://people.ubuntu.com/~mvo/apt/mirror/mirrors/dists/feisty/Release.gpg
+   
+    - the matching source.list entry
+    deb mirror://people.ubuntu.com/~mvo/apt/mirror/mirrors feisty main
+   
+    - we actually want to go after:
+    http://people.ubuntu.com/~mvo/apt/mirror/mirrors
+
+    And we need to save the BaseUri for later:
+    - mirror://people.ubuntu.com/~mvo/apt/mirror/mirrors
+
+   FIXME: what if we have two similar prefixes?
+     mirror://people.ubuntu.com/~mvo/mirror
+     mirror://people.ubuntu.com/~mvo/mirror2
+   then mirror_uri_str looks like:
+     mirror://people.ubuntu.com/~mvo/apt/mirror/dists/feisty/Release.gpg
+     mirror://people.ubuntu.com/~mvo/apt/mirror2/dists/feisty/Release.gpg
+   we search sources.list and find:
+     mirror://people.ubuntu.com/~mvo/apt/mirror
+   in both cases! So we need to apply some domain knowledge here :( and
+   check for /dists/ or /Release.gpg as suffixes
+   */
+   if(Debug)
+      std::cerr << "GetMirrorFile: " << mirror_uri_str << std::endl;
+
+   // read sources.list and find match
+   vector<metaIndex *>::const_iterator I;
+   pkgSourceList list;
+   list.ReadMainList();
+   for(I=list.begin(); I != list.end(); I++)
+   {
+      string uristr = (*I)->GetURI();
+      if(Debug)
+        std::cerr << "Checking: " << uristr << std::endl;
+      if(uristr.substr(0,strlen("mirror://")) != string("mirror://"))
+        continue;
+      // find matching uri in sources.list
+      if(mirror_uri_str.substr(0,uristr.size()) == uristr)
+      {
+        if(Debug)
+           std::cerr << "found BaseURI: " << uristr << std::endl;
+        BaseUri = uristr.substr(0,uristr.size()-1);
+      }
+   }
+   string fetch = BaseUri;
+   fetch.replace(0,strlen("mirror://"),"http://");
+
+   // get new file
+   MirrorFile = _config->FindDir("Dir::State::mirrors") + URItoFileName(BaseUri);
+
+   if(Debug) 
+   {
+      cerr << "base-uri: " << BaseUri << endl;
+      cerr << "mirror-file: " << MirrorFile << endl;
+   }
+
+   // check the file, if it is not older than RefreshInterval just use it
+   // otherwise try to get a new one
+   if(FileExists(MirrorFile)) 
+   {
+      struct stat buf;
+      time_t t,now,refresh;
+      if(stat(MirrorFile.c_str(), &buf) != 0)
+        return false;
+      t = std::max(buf.st_mtime, buf.st_ctime);
+      now = time(NULL);
+      refresh = 60*_config->FindI("Acquire::Mirror::RefreshInterval",360);
+      if(t + refresh > now)
+      {
+        if(Debug)
+           clog << "Mirror file is in RefreshInterval" << endl;
+        HasMirrorFile = true;
+        return true;
+      }
+      if(Debug)
+        clog << "Mirror file " << MirrorFile << " older than " << refresh << "min, re-download it" << endl;
+   }
+
+   // not that great to use pkgAcquire here, but we do not have 
+   // any other way right now
+   pkgAcquire Fetcher;
+   new pkgAcqFile(&Fetcher, fetch, "", 0, "", "", "", MirrorFile);
+   bool res = (Fetcher.Run() == pkgAcquire::Continue);
+   if(res)
+      HasMirrorFile = true;
+   Fetcher.Shutdown();
+   return res;
+}
+
+bool MirrorMethod::SelectMirror()
+{
+   // FIXME: make the mirror selection more clever, do not 
+   //        just use the first one!
+   ifstream in(MirrorFile.c_str());
+   getline(in, Mirror);
+   if(Debug)
+      cerr << "Using mirror: " << Mirror << endl;
+
+   UsedMirror = Mirror;
+   return true;
+}
+
+// MirrorMethod::Fetch - Fetch an item                                 /*{{{*/
+// ---------------------------------------------------------------------
+/* This adds an item to the pipeline. We keep the pipeline at a fixed
+   depth. */
+bool MirrorMethod::Fetch(FetchItem *Itm)
+{
+   // select mirror only once per session
+   if(!HasMirrorFile)
+   {
+      Clean(_config->FindDir("Dir::State::mirrors"));
+      GetMirrorFile(Itm->Uri);
+      SelectMirror();
+   }
+
+   for (FetchItem *I = Queue; I != 0; I = I->Next)
+   {
+      if(I->Uri.find("mirror://") != string::npos)
+        I->Uri.replace(0,BaseUri.size(),Mirror);
+   }
+
+   // now run the real fetcher
+   return HttpMethod::Fetch(Itm);
+};
+
+void MirrorMethod::Fail(string Err,bool Transient)
+{
+   if(Queue->Uri.find("http://") != string::npos)
+      Queue->Uri.replace(0,Mirror.size(), BaseUri);
+   pkgAcqMethod::Fail(Err, Transient);
+}
+
+void MirrorMethod::URIStart(FetchResult &Res)
+{
+   if(Queue->Uri.find("http://") != string::npos)
+      Queue->Uri.replace(0,Mirror.size(), BaseUri);
+   pkgAcqMethod::URIStart(Res);
+}
+
+void MirrorMethod::URIDone(FetchResult &Res,FetchResult *Alt)
+{
+   if(Queue->Uri.find("http://") != string::npos)
+      Queue->Uri.replace(0,Mirror.size(), BaseUri);
+   pkgAcqMethod::URIDone(Res, Alt);
+}
+
+
+int main()
+{
+   setlocale(LC_ALL, "");
+
+   MirrorMethod Mth;
+
+   return Mth.Loop();
+}
+
+
diff --git a/methods/mirror.h b/methods/mirror.h
new file mode 100644 (file)
index 0000000..798f5a9
--- /dev/null
@@ -0,0 +1,51 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $
+// $Id: http.h,v 1.12 2002/04/18 05:09:38 jgg Exp $
+/* ######################################################################
+
+   MIRROR Aquire Method - This is the MIRROR aquire method for APT.
+
+   ##################################################################### */
+                                                                       /*}}}*/
+
+#ifndef APT_MIRROR_H
+#define APT_MIRROR_H
+
+
+#include <iostream>
+
+using std::cout;
+using std::cerr;
+using std::endl;
+
+#include "http.h"
+
+class MirrorMethod : public HttpMethod
+{
+   FetchResult Res;
+   // we simply transform between BaseUri and Mirror
+   string BaseUri;    // the original mirror://... url
+   string Mirror;     // the selected mirror uri (http://...)
+   string MirrorFile; // 
+   bool HasMirrorFile;
+
+   bool Debug;
+
+ protected:
+   bool GetMirrorFile(string uri);
+   bool SelectMirror();
+   bool Clean(string dir);
+   
+   // we need to overwrite those to transform the url back
+   virtual void Fail(string Why, bool Transient = false);
+   virtual void URIStart(FetchResult &Res);
+   virtual void URIDone(FetchResult &Res,FetchResult *Alt = 0);
+   virtual bool Configuration(string Message);
+
+ public:
+   MirrorMethod();
+   virtual bool Fetch(FetchItem *Itm);
+};
+
+
+#endif
diff --git a/mirror-failure.py b/mirror-failure.py
new file mode 100644 (file)
index 0000000..e7d2bbf
--- /dev/null
@@ -0,0 +1,23 @@
+# File: cgihttpserver-example-1.py
+
+import CGIHTTPServer
+import BaseHTTPServer
+
+class Handler(CGIHTTPServer.CGIHTTPRequestHandler):
+    #cgi_directories = ["/cgi"]
+    def do_POST(self):
+       print "do_POST"
+        #print self.command
+        #print self.path
+        #print self.headers
+        print self.client_address
+        data = self.rfile.read(int(self.headers["content-length"]))
+        print data
+        self.wfile.write("200 Ok\n");
+
+PORT = 8000
+
+httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler)
+print "serving at port", PORT
+httpd.serve_forever()
+
index de72c430eb5ec7945a4ac07549d429d6aeb1baed..f2f151dd3387a015e9814e4f2d8d058790010f7e 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-08-09 23:46+0200\n"
+"POT-Creation-Date: 2007-02-06 11:14+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,145 +15,153 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: cmdline/apt-cache.cc:135
+#: cmdline/apt-cache.cc:143
 #, c-format
 msgid "Package %s version %s has an unmet dep:\n"
 msgstr ""
 
-#: cmdline/apt-cache.cc:175 cmdline/apt-cache.cc:527 cmdline/apt-cache.cc:615
-#: cmdline/apt-cache.cc:771 cmdline/apt-cache.cc:989 cmdline/apt-cache.cc:1357
-#: cmdline/apt-cache.cc:1508
+#: cmdline/apt-cache.cc:183 cmdline/apt-cache.cc:552 cmdline/apt-cache.cc:640
+#: cmdline/apt-cache.cc:796 cmdline/apt-cache.cc:1018
+#: cmdline/apt-cache.cc:1419 cmdline/apt-cache.cc:1570
 #, c-format
 msgid "Unable to locate package %s"
 msgstr ""
 
-#: cmdline/apt-cache.cc:232
+#: cmdline/apt-cache.cc:247
 msgid "Total package names : "
 msgstr ""
 
-#: cmdline/apt-cache.cc:272
+#: cmdline/apt-cache.cc:287
 msgid "  Normal packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:273
+#: cmdline/apt-cache.cc:288
 msgid "  Pure virtual packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:274
+#: cmdline/apt-cache.cc:289
 msgid "  Single virtual packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:275
+#: cmdline/apt-cache.cc:290
 msgid "  Mixed virtual packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:276
+#: cmdline/apt-cache.cc:291
 msgid "  Missing: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:278
+#: cmdline/apt-cache.cc:293
 msgid "Total distinct versions: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:280
+#: cmdline/apt-cache.cc:295
+msgid "Total Distinct Descriptions: "
+msgstr ""
+
+#: cmdline/apt-cache.cc:297
 msgid "Total dependencies: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:283
+#: cmdline/apt-cache.cc:300
 msgid "Total ver/file relations: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:285
+#: cmdline/apt-cache.cc:302
+msgid "Total Desc/File relations: "
+msgstr ""
+
+#: cmdline/apt-cache.cc:304
 msgid "Total Provides mappings: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:297
+#: cmdline/apt-cache.cc:316
 msgid "Total globbed strings: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:311
+#: cmdline/apt-cache.cc:330
 msgid "Total dependency version space: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:316
+#: cmdline/apt-cache.cc:335
 msgid "Total slack space: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:324
+#: cmdline/apt-cache.cc:343
 msgid "Total space accounted for: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:446 cmdline/apt-cache.cc:1189
+#: cmdline/apt-cache.cc:471 cmdline/apt-cache.cc:1218
 #, c-format
 msgid "Package file %s is out of sync."
 msgstr ""
 
-#: cmdline/apt-cache.cc:1231
+#: cmdline/apt-cache.cc:1293
 msgid "You must give exactly one pattern"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1385
+#: cmdline/apt-cache.cc:1447
 msgid "No packages found"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1462
+#: cmdline/apt-cache.cc:1524
 msgid "Package files:"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1469 cmdline/apt-cache.cc:1555
+#: cmdline/apt-cache.cc:1531 cmdline/apt-cache.cc:1617
 msgid "Cache is out of sync, can't x-ref a package file"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1470
+#: cmdline/apt-cache.cc:1532
 #, c-format
 msgid "%4i %s\n"
 msgstr ""
 
 #. Show any packages have explicit pins
-#: cmdline/apt-cache.cc:1482
+#: cmdline/apt-cache.cc:1544
 msgid "Pinned packages:"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1494 cmdline/apt-cache.cc:1535
+#: cmdline/apt-cache.cc:1556 cmdline/apt-cache.cc:1597
 msgid "(not found)"
 msgstr ""
 
 #. Installed version
-#: cmdline/apt-cache.cc:1515
+#: cmdline/apt-cache.cc:1577
 msgid "  Installed: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:1517 cmdline/apt-cache.cc:1525
+#: cmdline/apt-cache.cc:1579 cmdline/apt-cache.cc:1587
 msgid "(none)"
 msgstr ""
 
 #. Candidate Version
-#: cmdline/apt-cache.cc:1522
+#: cmdline/apt-cache.cc:1584
 msgid "  Candidate: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:1532
+#: cmdline/apt-cache.cc:1594
 msgid "  Package pin: "
 msgstr ""
 
 #. Show the priority tables
-#: cmdline/apt-cache.cc:1541
+#: cmdline/apt-cache.cc:1603
 msgid "  Version table:"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1556
+#: cmdline/apt-cache.cc:1618
 #, c-format
 msgid "       %4i %s\n"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1652 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70
+#: cmdline/apt-cache.cc:1714 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70
 #: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550
-#: cmdline/apt-get.cc:2462 cmdline/apt-sortpkgs.cc:144
+#: cmdline/apt-get.cc:2549 cmdline/apt-sortpkgs.cc:144
 #, c-format
 msgid "%s %s for %s %s compiled on %s %s\n"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1659
+#: cmdline/apt-cache.cc:1721
 msgid ""
 "Usage: apt-cache [options] command\n"
 "       apt-cache [options] add file1 [file2 ...]\n"
@@ -243,8 +251,7 @@ msgid ""
 "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
 msgstr ""
 
-#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:714
-#: apt-pkg/pkgcachegen.cc:819
+#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:819
 #, c-format
 msgid "Unable to write to %s"
 msgstr ""
@@ -547,7 +554,7 @@ msgstr ""
 msgid "Y"
 msgstr ""
 
-#: cmdline/apt-get.cc:143 cmdline/apt-get.cc:1574
+#: cmdline/apt-get.cc:143 cmdline/apt-get.cc:1662
 #, c-format
 msgid "Regex compilation error - %s"
 msgstr ""
@@ -646,118 +653,118 @@ msgstr ""
 msgid "%lu not fully installed or removed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:650
+#: cmdline/apt-get.cc:664
 msgid "Correcting dependencies..."
 msgstr ""
 
-#: cmdline/apt-get.cc:653
+#: cmdline/apt-get.cc:667
 msgid " failed."
 msgstr ""
 
-#: cmdline/apt-get.cc:656
+#: cmdline/apt-get.cc:670
 msgid "Unable to correct dependencies"
 msgstr ""
 
-#: cmdline/apt-get.cc:659
+#: cmdline/apt-get.cc:673
 msgid "Unable to minimize the upgrade set"
 msgstr ""
 
-#: cmdline/apt-get.cc:661
+#: cmdline/apt-get.cc:675
 msgid " Done"
 msgstr ""
 
-#: cmdline/apt-get.cc:665
+#: cmdline/apt-get.cc:679
 msgid "You might want to run `apt-get -f install' to correct these."
 msgstr ""
 
-#: cmdline/apt-get.cc:668
+#: cmdline/apt-get.cc:682
 msgid "Unmet dependencies. Try using -f."
 msgstr ""
 
-#: cmdline/apt-get.cc:690
+#: cmdline/apt-get.cc:704
 msgid "WARNING: The following packages cannot be authenticated!"
 msgstr ""
 
-#: cmdline/apt-get.cc:694
+#: cmdline/apt-get.cc:708
 msgid "Authentication warning overridden.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:701
+#: cmdline/apt-get.cc:715
 msgid "Install these packages without verification [y/N]? "
 msgstr ""
 
-#: cmdline/apt-get.cc:703
+#: cmdline/apt-get.cc:717
 msgid "Some packages could not be authenticated"
 msgstr ""
 
-#: cmdline/apt-get.cc:712 cmdline/apt-get.cc:859
+#: cmdline/apt-get.cc:726 cmdline/apt-get.cc:873
 msgid "There are problems and -y was used without --force-yes"
 msgstr ""
 
-#: cmdline/apt-get.cc:756
+#: cmdline/apt-get.cc:770
 msgid "Internal error, InstallPackages was called with broken packages!"
 msgstr ""
 
-#: cmdline/apt-get.cc:765
+#: cmdline/apt-get.cc:779
 msgid "Packages need to be removed but remove is disabled."
 msgstr ""
 
-#: cmdline/apt-get.cc:776
+#: cmdline/apt-get.cc:790
 msgid "Internal error, Ordering didn't finish"
 msgstr ""
 
-#: cmdline/apt-get.cc:792 cmdline/apt-get.cc:1893 cmdline/apt-get.cc:1926
+#: cmdline/apt-get.cc:806 cmdline/apt-get.cc:1980 cmdline/apt-get.cc:2013
 msgid "Unable to lock the download directory"
 msgstr ""
 
-#: cmdline/apt-get.cc:802 cmdline/apt-get.cc:1974 cmdline/apt-get.cc:2210
+#: cmdline/apt-get.cc:816 cmdline/apt-get.cc:2061 cmdline/apt-get.cc:2297
 #: apt-pkg/cachefile.cc:67
 msgid "The list of sources could not be read."
 msgstr ""
 
-#: cmdline/apt-get.cc:817
+#: cmdline/apt-get.cc:831
 msgid "How odd.. The sizes didn't match, email apt@packages.debian.org"
 msgstr ""
 
-#: cmdline/apt-get.cc:822
+#: cmdline/apt-get.cc:836
 #, c-format
 msgid "Need to get %sB/%sB of archives.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:825
+#: cmdline/apt-get.cc:839
 #, c-format
 msgid "Need to get %sB of archives.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:830
+#: cmdline/apt-get.cc:844
 #, c-format
 msgid "After unpacking %sB of additional disk space will be used.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:833
+#: cmdline/apt-get.cc:847
 #, c-format
 msgid "After unpacking %sB disk space will be freed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:847 cmdline/apt-get.cc:2064
+#: cmdline/apt-get.cc:861 cmdline/apt-get.cc:2151
 #, c-format
 msgid "Couldn't determine free space in %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:850
+#: cmdline/apt-get.cc:864
 #, c-format
 msgid "You don't have enough free space in %s."
 msgstr ""
 
-#: cmdline/apt-get.cc:865 cmdline/apt-get.cc:885
+#: cmdline/apt-get.cc:879 cmdline/apt-get.cc:899
 msgid "Trivial Only specified but this is not a trivial operation."
 msgstr ""
 
-#: cmdline/apt-get.cc:867
+#: cmdline/apt-get.cc:881
 msgid "Yes, do as I say!"
 msgstr ""
 
-#: cmdline/apt-get.cc:869
+#: cmdline/apt-get.cc:883
 #, c-format
 msgid ""
 "You are about to do something potentially harmful.\n"
@@ -765,74 +772,74 @@ msgid ""
 " ?] "
 msgstr ""
 
-#: cmdline/apt-get.cc:875 cmdline/apt-get.cc:894
+#: cmdline/apt-get.cc:889 cmdline/apt-get.cc:908
 msgid "Abort."
 msgstr ""
 
-#: cmdline/apt-get.cc:890
+#: cmdline/apt-get.cc:904
 msgid "Do you want to continue [Y/n]? "
 msgstr ""
 
-#: cmdline/apt-get.cc:962 cmdline/apt-get.cc:1369 cmdline/apt-get.cc:2107
+#: cmdline/apt-get.cc:976 cmdline/apt-get.cc:1383 cmdline/apt-get.cc:2194
 #, c-format
 msgid "Failed to fetch %s  %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:980
+#: cmdline/apt-get.cc:994
 msgid "Some files failed to download"
 msgstr ""
 
-#: cmdline/apt-get.cc:981 cmdline/apt-get.cc:2116
+#: cmdline/apt-get.cc:995 cmdline/apt-get.cc:2203
 msgid "Download complete and in download only mode"
 msgstr ""
 
-#: cmdline/apt-get.cc:987
+#: cmdline/apt-get.cc:1001
 msgid ""
 "Unable to fetch some archives, maybe run apt-get update or try with --fix-"
 "missing?"
 msgstr ""
 
-#: cmdline/apt-get.cc:991
+#: cmdline/apt-get.cc:1005
 msgid "--fix-missing and media swapping is not currently supported"
 msgstr ""
 
-#: cmdline/apt-get.cc:996
+#: cmdline/apt-get.cc:1010
 msgid "Unable to correct missing packages."
 msgstr ""
 
-#: cmdline/apt-get.cc:997
+#: cmdline/apt-get.cc:1011
 msgid "Aborting install."
 msgstr ""
 
-#: cmdline/apt-get.cc:1031
+#: cmdline/apt-get.cc:1045
 #, c-format
 msgid "Note, selecting %s instead of %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1041
+#: cmdline/apt-get.cc:1055
 #, c-format
 msgid "Skipping %s, it is already installed and upgrade is not set.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1059
+#: cmdline/apt-get.cc:1073
 #, c-format
 msgid "Package %s is not installed, so not removed\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1070
+#: cmdline/apt-get.cc:1084
 #, c-format
 msgid "Package %s is a virtual package provided by:\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1082
+#: cmdline/apt-get.cc:1096
 msgid " [Installed]"
 msgstr ""
 
-#: cmdline/apt-get.cc:1087
+#: cmdline/apt-get.cc:1101
 msgid "You should explicitly select one to install."
 msgstr ""
 
-#: cmdline/apt-get.cc:1092
+#: cmdline/apt-get.cc:1106
 #, c-format
 msgid ""
 "Package %s is not available, but is referred to by another package.\n"
@@ -840,97 +847,112 @@ msgid ""
 "is only available from another source\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1111
+#: cmdline/apt-get.cc:1125
 msgid "However the following packages replace it:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1114
+#: cmdline/apt-get.cc:1128
 #, c-format
 msgid "Package %s has no installation candidate"
 msgstr ""
 
-#: cmdline/apt-get.cc:1134
+#: cmdline/apt-get.cc:1148
 #, c-format
 msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1142
+#: cmdline/apt-get.cc:1156
 #, c-format
 msgid "%s is already the newest version.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1171
+#: cmdline/apt-get.cc:1185
 #, c-format
 msgid "Release '%s' for '%s' was not found"
 msgstr ""
 
-#: cmdline/apt-get.cc:1173
+#: cmdline/apt-get.cc:1187
 #, c-format
 msgid "Version '%s' for '%s' was not found"
 msgstr ""
 
-#: cmdline/apt-get.cc:1179
+#: cmdline/apt-get.cc:1193
 #, c-format
 msgid "Selected version %s (%s) for %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1316
+#: cmdline/apt-get.cc:1330
 msgid "The update command takes no arguments"
 msgstr ""
 
-#: cmdline/apt-get.cc:1329
+#: cmdline/apt-get.cc:1343
 msgid "Unable to lock the list directory"
 msgstr ""
 
-#: cmdline/apt-get.cc:1396 cmdline/apt-get.cc:1398
+#: cmdline/apt-get.cc:1410 cmdline/apt-get.cc:1412
 msgid ""
 "Some index files failed to download, they have been ignored, or old ones "
 "used instead."
 msgstr ""
 
-#: cmdline/apt-get.cc:1412
+#: cmdline/apt-get.cc:1433
 msgid "We are not supposed to delete stuff, can't start AutoRemover"
 msgstr ""
 
-#: cmdline/apt-get.cc:1437
+#: cmdline/apt-get.cc:1460
+msgid ""
+"The following packages were automatically installed and are no longer "
+"required:"
+msgstr ""
+
+#: cmdline/apt-get.cc:1462
+msgid "Use 'apt-get autoremove' to remove them."
+msgstr ""
+
+#: cmdline/apt-get.cc:1467
 msgid ""
 "Hmm, seems like the AutoRemover destroyed something which really\n"
 "shouldn't happen. Please file a bug report against apt."
 msgstr ""
 
-#: cmdline/apt-get.cc:1440 cmdline/apt-get.cc:1642
+#: cmdline/apt-get.cc:1470 cmdline/apt-get.cc:1731
 msgid "The following information may help to resolve the situation:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1444
+#: cmdline/apt-get.cc:1474
 msgid "Internal Error, AutoRemover broke stuff"
 msgstr ""
 
-#: cmdline/apt-get.cc:1463
+#: cmdline/apt-get.cc:1493
 msgid "Internal error, AllUpgrade broke stuff"
 msgstr ""
 
-#: cmdline/apt-get.cc:1561 cmdline/apt-get.cc:1597
+#: cmdline/apt-get.cc:1538
+#, c-format
+msgid "Couldn't find task %s"
+msgstr ""
+
+#: cmdline/apt-get.cc:1649 cmdline/apt-get.cc:1685
 #, c-format
 msgid "Couldn't find package %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:1584
+#: cmdline/apt-get.cc:1672
 #, c-format
 msgid "Note, selecting %s for regex '%s'\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:1614
+#: cmdline/apt-get.cc:1703
 msgid "You might want to run `apt-get -f install' to correct these:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1617
+#: cmdline/apt-get.cc:1706
 msgid ""
 "Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a "
 "solution)."
 msgstr ""
 
-#: cmdline/apt-get.cc:1629
+#: cmdline/apt-get.cc:1718
 msgid ""
 "Some packages could not be installed. This may mean that you have\n"
 "requested an impossible situation or if you are using the unstable\n"
@@ -938,159 +960,159 @@ msgid ""
 "or been moved out of Incoming."
 msgstr ""
 
-#: cmdline/apt-get.cc:1637
+#: cmdline/apt-get.cc:1726
 msgid ""
 "Since you only requested a single operation it is extremely likely that\n"
 "the package is simply not installable and a bug report against\n"
 "that package should be filed."
 msgstr ""
 
-#: cmdline/apt-get.cc:1645
+#: cmdline/apt-get.cc:1734
 msgid "Broken packages"
 msgstr ""
 
-#: cmdline/apt-get.cc:1676
+#: cmdline/apt-get.cc:1763
 msgid "The following extra packages will be installed:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1765
+#: cmdline/apt-get.cc:1852
 msgid "Suggested packages:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1766
+#: cmdline/apt-get.cc:1853
 msgid "Recommended packages:"
 msgstr ""
 
-#: cmdline/apt-get.cc:1786
+#: cmdline/apt-get.cc:1873
 msgid "Calculating upgrade... "
 msgstr ""
 
-#: cmdline/apt-get.cc:1789 methods/ftp.cc:702 methods/connect.cc:101
+#: cmdline/apt-get.cc:1876 methods/ftp.cc:702 methods/connect.cc:100
 msgid "Failed"
 msgstr ""
 
-#: cmdline/apt-get.cc:1794
+#: cmdline/apt-get.cc:1881
 msgid "Done"
 msgstr ""
 
-#: cmdline/apt-get.cc:1861 cmdline/apt-get.cc:1869
+#: cmdline/apt-get.cc:1948 cmdline/apt-get.cc:1956
 msgid "Internal error, problem resolver broke stuff"
 msgstr ""
 
-#: cmdline/apt-get.cc:1969
+#: cmdline/apt-get.cc:2056
 msgid "Must specify at least one package to fetch source for"
 msgstr ""
 
-#: cmdline/apt-get.cc:1999 cmdline/apt-get.cc:2228
+#: cmdline/apt-get.cc:2086 cmdline/apt-get.cc:2315
 #, c-format
 msgid "Unable to find a source package for %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2043
+#: cmdline/apt-get.cc:2130
 #, c-format
 msgid "Skipping already downloaded file '%s'\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2067
+#: cmdline/apt-get.cc:2154
 #, c-format
 msgid "You don't have enough free space in %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2072
+#: cmdline/apt-get.cc:2159
 #, c-format
 msgid "Need to get %sB/%sB of source archives.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2075
+#: cmdline/apt-get.cc:2162
 #, c-format
 msgid "Need to get %sB of source archives.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2081
+#: cmdline/apt-get.cc:2168
 #, c-format
 msgid "Fetch source %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2112
+#: cmdline/apt-get.cc:2199
 msgid "Failed to fetch some archives."
 msgstr ""
 
-#: cmdline/apt-get.cc:2140
+#: cmdline/apt-get.cc:2227
 #, c-format
 msgid "Skipping unpack of already unpacked source in %s\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2152
+#: cmdline/apt-get.cc:2239
 #, c-format
 msgid "Unpack command '%s' failed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2153
+#: cmdline/apt-get.cc:2240
 #, c-format
 msgid "Check if the 'dpkg-dev' package is installed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2170
+#: cmdline/apt-get.cc:2257
 #, c-format
 msgid "Build command '%s' failed.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2189
+#: cmdline/apt-get.cc:2276
 msgid "Child process failed"
 msgstr ""
 
-#: cmdline/apt-get.cc:2205
+#: cmdline/apt-get.cc:2292
 msgid "Must specify at least one package to check builddeps for"
 msgstr ""
 
-#: cmdline/apt-get.cc:2233
+#: cmdline/apt-get.cc:2320
 #, c-format
 msgid "Unable to get build-dependency information for %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2253
+#: cmdline/apt-get.cc:2340
 #, c-format
 msgid "%s has no build depends.\n"
 msgstr ""
 
-#: cmdline/apt-get.cc:2305
+#: cmdline/apt-get.cc:2392
 #, c-format
 msgid ""
 "%s dependency for %s cannot be satisfied because the package %s cannot be "
 "found"
 msgstr ""
 
-#: cmdline/apt-get.cc:2357
+#: cmdline/apt-get.cc:2444
 #, c-format
 msgid ""
 "%s dependency for %s cannot be satisfied because no available versions of "
 "package %s can satisfy version requirements"
 msgstr ""
 
-#: cmdline/apt-get.cc:2392
+#: cmdline/apt-get.cc:2479
 #, c-format
 msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new"
 msgstr ""
 
-#: cmdline/apt-get.cc:2417
+#: cmdline/apt-get.cc:2504
 #, c-format
 msgid "Failed to satisfy %s dependency for %s: %s"
 msgstr ""
 
-#: cmdline/apt-get.cc:2431
+#: cmdline/apt-get.cc:2518
 #, c-format
 msgid "Build-dependencies for %s could not be satisfied."
 msgstr ""
 
-#: cmdline/apt-get.cc:2435
+#: cmdline/apt-get.cc:2522
 msgid "Failed to process build dependencies"
 msgstr ""
 
-#: cmdline/apt-get.cc:2467
+#: cmdline/apt-get.cc:2554
 msgid "Supported modules:"
 msgstr ""
 
-#: cmdline/apt-get.cc:2508
+#: cmdline/apt-get.cc:2595
 msgid ""
 "Usage: apt-get [options] command\n"
 "       apt-get [options] install|remove pkg1 [pkg2 ...]\n"
@@ -1345,7 +1367,7 @@ msgstr ""
 
 #: apt-inst/extract.cc:467 apt-pkg/contrib/configuration.cc:750
 #: apt-pkg/contrib/cdromutl.cc:153 apt-pkg/sourcelist.cc:324
-#: apt-pkg/acquire.cc:421 apt-pkg/clean.cc:38
+#: apt-pkg/acquire.cc:421 apt-pkg/clean.cc:38 methods/mirror.cc:82
 #, c-format
 msgid "Unable to read %s"
 msgstr ""
@@ -1375,9 +1397,7 @@ msgid "The info and temp directories need to be on the same filesystem"
 msgstr ""
 
 #. Build the status cache
-#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:647
-#: apt-pkg/pkgcachegen.cc:716 apt-pkg/pkgcachegen.cc:721
-#: apt-pkg/pkgcachegen.cc:844 apt-pkg/pkgcachegen.cc:752
+#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:752
 #: apt-pkg/pkgcachegen.cc:821 apt-pkg/pkgcachegen.cc:826
 #: apt-pkg/pkgcachegen.cc:949
 msgid "Reading package lists"
@@ -1507,13 +1527,12 @@ msgstr ""
 msgid "File not found"
 msgstr ""
 
-#: methods/copy.cc:42 methods/gpgv.cc:281 methods/gzip.cc:133
-#: methods/gzip.cc:142 methods/gzip.cc:134 methods/gzip.cc:143
+#: methods/copy.cc:42 methods/gpgv.cc:281 methods/gzip.cc:141
+#: methods/gzip.cc:150
 msgid "Failed to stat"
 msgstr ""
 
-#: methods/copy.cc:79 methods/gpgv.cc:278 methods/gzip.cc:139
-#: methods/gzip.cc:140
+#: methods/copy.cc:79 methods/gpgv.cc:278 methods/gzip.cc:147
 msgid "Failed to set modification time"
 msgstr ""
 
@@ -1639,7 +1658,7 @@ msgstr ""
 msgid "Unable to accept connection"
 msgstr ""
 
-#: methods/ftp.cc:864 methods/http.cc:958 methods/rsh.cc:303
+#: methods/ftp.cc:864 methods/http.cc:961 methods/rsh.cc:303
 msgid "Problem hashing file"
 msgstr ""
 
@@ -1666,39 +1685,39 @@ msgstr ""
 msgid "Unable to invoke "
 msgstr ""
 
-#: methods/connect.cc:64
+#: methods/connect.cc:65
 #, c-format
 msgid "Connecting to %s (%s)"
 msgstr ""
 
-#: methods/connect.cc:71
+#: methods/connect.cc:72
 #, c-format
 msgid "[IP: %s %s]"
 msgstr ""
 
-#: methods/connect.cc:80
+#: methods/connect.cc:79
 #, c-format
 msgid "Could not create a socket for %s (f=%u t=%u p=%u)"
 msgstr ""
 
-#: methods/connect.cc:86
+#: methods/connect.cc:85
 #, c-format
 msgid "Cannot initiate the connection to %s:%s (%s)."
 msgstr ""
 
-#: methods/connect.cc:93
+#: methods/connect.cc:92
 #, c-format
 msgid "Could not connect to %s:%s (%s), connection timed out"
 msgstr ""
 
-#: methods/connect.cc:108
+#: methods/connect.cc:107
 #, c-format
 msgid "Could not connect to %s:%s (%s)."
 msgstr ""
 
 #. We say this mainly because the pause here is for the
 #. ssh connection that is still going
-#: methods/connect.cc:136 methods/rsh.cc:425
+#: methods/connect.cc:135 methods/rsh.cc:425
 #, c-format
 msgid "Connecting to %s"
 msgstr ""
@@ -1760,12 +1779,12 @@ msgid ""
 "available:\n"
 msgstr ""
 
-#: methods/gzip.cc:57
+#: methods/gzip.cc:64
 #, c-format
 msgid "Couldn't open pipe for %s"
 msgstr ""
 
-#: methods/gzip.cc:102
+#: methods/gzip.cc:109
 #, c-format
 msgid "Read error from %s process"
 msgstr ""
@@ -1831,15 +1850,15 @@ msgstr ""
 msgid "Error reading from server"
 msgstr ""
 
-#: methods/http.cc:1107
+#: methods/http.cc:1110
 msgid "Bad header data"
 msgstr ""
 
-#: methods/http.cc:1124
+#: methods/http.cc:1127
 msgid "Connection failed"
 msgstr ""
 
-#: methods/http.cc:1215
+#: methods/http.cc:1218
 msgid "Internal error"
 msgstr ""
 
@@ -1852,7 +1871,7 @@ msgstr ""
 msgid "Couldn't make mmap of %lu bytes"
 msgstr ""
 
-#: apt-pkg/contrib/strutl.cc:938 apt-pkg/contrib/strutl.cc:981
+#: apt-pkg/contrib/strutl.cc:981
 #, c-format
 msgid "Selection %s not found"
 msgstr ""
@@ -1912,12 +1931,12 @@ msgstr ""
 msgid "Syntax error %s:%u: Extra junk at end of file"
 msgstr ""
 
-#: apt-pkg/contrib/progress.cc:154
+#: apt-pkg/contrib/progress.cc:155
 #, c-format
 msgid "%c%s... Error!"
 msgstr ""
 
-#: apt-pkg/contrib/progress.cc:156
+#: apt-pkg/contrib/progress.cc:157
 #, c-format
 msgid "%c%s... Done"
 msgstr ""
@@ -1974,6 +1993,7 @@ msgid "Unable to stat the mount point %s"
 msgstr ""
 
 #: apt-pkg/contrib/cdromutl.cc:149 apt-pkg/acquire.cc:427 apt-pkg/clean.cc:44
+#: methods/mirror.cc:88
 #, c-format
 msgid "Unable to change to %s"
 msgstr ""
@@ -2049,72 +2069,76 @@ msgstr ""
 msgid "Problem syncing the file"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:126 apt-pkg/pkgcache.cc:137
+#: apt-pkg/pkgcache.cc:137
 msgid "Empty package cache"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:132 apt-pkg/pkgcache.cc:143
+#: apt-pkg/pkgcache.cc:143
 msgid "The package cache file is corrupted"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:137 apt-pkg/pkgcache.cc:148
+#: apt-pkg/pkgcache.cc:148
 msgid "The package cache file is an incompatible version"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:142 apt-pkg/pkgcache.cc:153
+#: apt-pkg/pkgcache.cc:153
 #, c-format
 msgid "This APT does not support the versioning system '%s'"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:147 apt-pkg/pkgcache.cc:158
+#: apt-pkg/pkgcache.cc:158
 msgid "The package cache was built for a different architecture"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:218 apt-pkg/pkgcache.cc:229
+#: apt-pkg/pkgcache.cc:229
 msgid "Depends"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:218 apt-pkg/pkgcache.cc:229
+#: apt-pkg/pkgcache.cc:229
 msgid "PreDepends"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:218 apt-pkg/pkgcache.cc:229
+#: apt-pkg/pkgcache.cc:229
 msgid "Suggests"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:219 apt-pkg/pkgcache.cc:230
+#: apt-pkg/pkgcache.cc:230
 msgid "Recommends"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:219 apt-pkg/pkgcache.cc:230
+#: apt-pkg/pkgcache.cc:230
 msgid "Conflicts"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:219 apt-pkg/pkgcache.cc:230
+#: apt-pkg/pkgcache.cc:230
 msgid "Replaces"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:220 apt-pkg/pkgcache.cc:231
+#: apt-pkg/pkgcache.cc:231
 msgid "Obsoletes"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:231 apt-pkg/pkgcache.cc:242
+#: apt-pkg/pkgcache.cc:231
+msgid "Breaks"
+msgstr ""
+
+#: apt-pkg/pkgcache.cc:242
 msgid "important"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:231 apt-pkg/pkgcache.cc:242
+#: apt-pkg/pkgcache.cc:242
 msgid "required"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:231 apt-pkg/pkgcache.cc:242
+#: apt-pkg/pkgcache.cc:242
 msgid "standard"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:232 apt-pkg/pkgcache.cc:243
+#: apt-pkg/pkgcache.cc:243
 msgid "optional"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:232 apt-pkg/pkgcache.cc:243
+#: apt-pkg/pkgcache.cc:243
 msgid "extra"
 msgstr ""
 
@@ -2144,12 +2168,12 @@ msgstr ""
 msgid "Failed to write temporary StateFile %s"
 msgstr ""
 
-#: apt-pkg/tagfile.cc:85 apt-pkg/tagfile.cc:92 apt-pkg/tagfile.cc:73
+#: apt-pkg/tagfile.cc:106
 #, c-format
 msgid "Unable to parse package file %s (1)"
 msgstr ""
 
-#: apt-pkg/tagfile.cc:186 apt-pkg/tagfile.cc:160
+#: apt-pkg/tagfile.cc:193
 #, c-format
 msgid "Unable to parse package file %s (2)"
 msgstr ""
@@ -2184,7 +2208,7 @@ msgstr ""
 msgid "Opening %s"
 msgstr ""
 
-#: apt-pkg/sourcelist.cc:220 apt-pkg/cdrom.cc:426 apt-pkg/cdrom.cc:450
+#: apt-pkg/sourcelist.cc:220 apt-pkg/cdrom.cc:450
 #, c-format
 msgid "Line %u too long in source list %s."
 msgstr ""
@@ -2217,19 +2241,19 @@ msgstr ""
 msgid "Index file type '%s' is not supported"
 msgstr ""
 
-#: apt-pkg/algorithms.cc:245 apt-pkg/algorithms.cc:248
+#: apt-pkg/algorithms.cc:248
 #, c-format
 msgid ""
 "The package %s needs to be reinstalled, but I can't find an archive for it."
 msgstr ""
 
-#: apt-pkg/algorithms.cc:1075 apt-pkg/algorithms.cc:1096
+#: apt-pkg/algorithms.cc:1104
 msgid ""
 "Error, pkgProblemResolver::Resolve generated breaks, this may be caused by "
 "held packages."
 msgstr ""
 
-#: apt-pkg/algorithms.cc:1077 apt-pkg/algorithms.cc:1098
+#: apt-pkg/algorithms.cc:1106
 msgid "Unable to correct problems, you have held broken packages."
 msgstr ""
 
@@ -2270,12 +2294,12 @@ msgstr ""
 msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter."
 msgstr ""
 
-#: apt-pkg/init.cc:122 apt-pkg/init.cc:125
+#: apt-pkg/init.cc:126
 #, c-format
 msgid "Packaging system '%s' is not supported"
 msgstr ""
 
-#: apt-pkg/init.cc:138 apt-pkg/init.cc:141
+#: apt-pkg/init.cc:142
 msgid "Unable to determine a suitable packaging system type"
 msgstr ""
 
@@ -2318,112 +2342,124 @@ msgstr ""
 msgid "Error occurred while processing %s (NewPackage)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:131 apt-pkg/pkgcachegen.cc:134
+#: apt-pkg/pkgcachegen.cc:134
 #, c-format
 msgid "Error occurred while processing %s (UsePackage1)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:152 apt-pkg/pkgcachegen.cc:182
+#: apt-pkg/pkgcachegen.cc:157
+#, c-format
+msgid "Error occured while processing %s (NewFileDesc1)"
+msgstr ""
+
+#: apt-pkg/pkgcachegen.cc:182
 #, c-format
 msgid "Error occurred while processing %s (UsePackage2)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:156 apt-pkg/pkgcachegen.cc:186
+#: apt-pkg/pkgcachegen.cc:186
 #, c-format
 msgid "Error occurred while processing %s (NewFileVer1)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:186 apt-pkg/pkgcachegen.cc:217
+#: apt-pkg/pkgcachegen.cc:217
 #, c-format
 msgid "Error occurred while processing %s (NewVersion1)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:190 apt-pkg/pkgcachegen.cc:221
+#: apt-pkg/pkgcachegen.cc:221
 #, c-format
 msgid "Error occurred while processing %s (UsePackage3)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:194 apt-pkg/pkgcachegen.cc:225
+#: apt-pkg/pkgcachegen.cc:225
 #, c-format
 msgid "Error occurred while processing %s (NewVersion2)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:209 apt-pkg/pkgcachegen.cc:255
+#: apt-pkg/pkgcachegen.cc:249
+#, c-format
+msgid "Error occured while processing %s (NewFileDesc2)"
+msgstr ""
+
+#: apt-pkg/pkgcachegen.cc:255
 msgid "Wow, you exceeded the number of package names this APT is capable of."
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:212 apt-pkg/pkgcachegen.cc:258
+#: apt-pkg/pkgcachegen.cc:258
 msgid "Wow, you exceeded the number of versions this APT is capable of."
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:215 apt-pkg/pkgcachegen.cc:264
+#: apt-pkg/pkgcachegen.cc:261
+msgid "Wow, you exceeded the number of descriptions this APT is capable of."
+msgstr ""
+
+#: apt-pkg/pkgcachegen.cc:264
 msgid "Wow, you exceeded the number of dependencies this APT is capable of."
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:243 apt-pkg/pkgcachegen.cc:292
+#: apt-pkg/pkgcachegen.cc:292
 #, c-format
 msgid "Error occurred while processing %s (FindPkg)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:256 apt-pkg/pkgcachegen.cc:305
+#: apt-pkg/pkgcachegen.cc:305
 #, c-format
 msgid "Error occurred while processing %s (CollectFileProvides)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:262 apt-pkg/pkgcachegen.cc:311
+#: apt-pkg/pkgcachegen.cc:311
 #, c-format
 msgid "Package %s %s was not found while processing file dependencies"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:577 apt-pkg/pkgcachegen.cc:682
+#: apt-pkg/pkgcachegen.cc:682
 #, c-format
 msgid "Couldn't stat source package list %s"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:662 apt-pkg/pkgcachegen.cc:767
+#: apt-pkg/pkgcachegen.cc:767
 msgid "Collecting File Provides"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:789 apt-pkg/pkgcachegen.cc:796
 #: apt-pkg/pkgcachegen.cc:894 apt-pkg/pkgcachegen.cc:901
 msgid "IO Error saving source cache"
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:126
+#: apt-pkg/acquire-item.cc:134
 #, c-format
 msgid "rename failed, %s (%s -> %s)."
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:236 apt-pkg/acquire-item.cc:951
-#: apt-pkg/acquire-item.cc:980
+#: apt-pkg/acquire-item.cc:286 apt-pkg/acquire-item.cc:1032
 msgid "MD5Sum mismatch"
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:646 apt-pkg/acquire-item.cc:675
-msgid "There are no public key available for the following key IDs:\n"
+#: apt-pkg/acquire-item.cc:726
+msgid "There is no public key available for the following key IDs:\n"
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:759 apt-pkg/acquire-item.cc:788
+#: apt-pkg/acquire-item.cc:840
 #, c-format
 msgid ""
 "I wasn't able to locate a file for the %s package. This might mean you need "
 "to manually fix this package. (due to missing arch)"
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:818 apt-pkg/acquire-item.cc:847
+#: apt-pkg/acquire-item.cc:899
 #, c-format
 msgid ""
 "I wasn't able to locate file for the %s package. This might mean you need to "
 "manually fix this package."
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:854 apt-pkg/acquire-item.cc:883
+#: apt-pkg/acquire-item.cc:935
 #, c-format
 msgid ""
 "The package index files are corrupted. No Filename: field for package %s."
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:941 apt-pkg/acquire-item.cc:970
+#: apt-pkg/acquire-item.cc:1022
 msgid "Size mismatch"
 msgstr ""
 
@@ -2432,93 +2468,94 @@ msgstr ""
 msgid "Vendor block %s contains no fingerprint"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:507 apt-pkg/cdrom.cc:531
+#: apt-pkg/cdrom.cc:531
 #, c-format
 msgid ""
 "Using CD-ROM mount point %s\n"
 "Mounting CD-ROM\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:516 apt-pkg/cdrom.cc:598 apt-pkg/cdrom.cc:540
-#: apt-pkg/cdrom.cc:622
+#: apt-pkg/cdrom.cc:540 apt-pkg/cdrom.cc:622
 msgid "Identifying.. "
 msgstr ""
 
-#: apt-pkg/cdrom.cc:541 apt-pkg/cdrom.cc:565
+#: apt-pkg/cdrom.cc:565
 #, c-format
 msgid "Stored label: %s \n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:561 apt-pkg/cdrom.cc:585
+#: apt-pkg/cdrom.cc:585
 #, c-format
 msgid "Using CD-ROM mount point %s\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:579 apt-pkg/cdrom.cc:603
+#: apt-pkg/cdrom.cc:603
 msgid "Unmounting CD-ROM\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:583 apt-pkg/cdrom.cc:607
+#: apt-pkg/cdrom.cc:607
 msgid "Waiting for disc...\n"
 msgstr ""
 
 #. Mount the new CDROM
-#: apt-pkg/cdrom.cc:591 apt-pkg/cdrom.cc:615
+#: apt-pkg/cdrom.cc:615
 msgid "Mounting CD-ROM...\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:609 apt-pkg/cdrom.cc:633
+#: apt-pkg/cdrom.cc:633
 msgid "Scanning disc for index files..\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:647
+#: apt-pkg/cdrom.cc:673
 #, c-format
-msgid "Found %i package indexes, %i source indexes and %i signatures\n"
+msgid ""
+"Found %i package indexes, %i source indexes, %i translation indexes and %i "
+"signatures\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:710 apt-pkg/cdrom.cc:737
+#: apt-pkg/cdrom.cc:737
 msgid "That is not a valid name, try again.\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:726 apt-pkg/cdrom.cc:753
+#: apt-pkg/cdrom.cc:753
 #, c-format
 msgid ""
 "This disc is called: \n"
 "'%s'\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:730 apt-pkg/cdrom.cc:757
+#: apt-pkg/cdrom.cc:757
 msgid "Copying package lists..."
 msgstr ""
 
-#: apt-pkg/cdrom.cc:754 apt-pkg/cdrom.cc:783
+#: apt-pkg/cdrom.cc:783
 msgid "Writing new source list\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:763 apt-pkg/cdrom.cc:792
+#: apt-pkg/cdrom.cc:792
 msgid "Source list entries for this disc are:\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:803 apt-pkg/cdrom.cc:832
+#: apt-pkg/cdrom.cc:832
 msgid "Unmounting CD-ROM..."
 msgstr ""
 
-#: apt-pkg/indexcopy.cc:261 apt-pkg/indexcopy.cc:263 apt-pkg/indexcopy.cc:830
+#: apt-pkg/indexcopy.cc:263 apt-pkg/indexcopy.cc:830
 #, c-format
 msgid "Wrote %i records.\n"
 msgstr ""
 
-#: apt-pkg/indexcopy.cc:263 apt-pkg/indexcopy.cc:265 apt-pkg/indexcopy.cc:832
+#: apt-pkg/indexcopy.cc:265 apt-pkg/indexcopy.cc:832
 #, c-format
 msgid "Wrote %i records with %i missing files.\n"
 msgstr ""
 
-#: apt-pkg/indexcopy.cc:266 apt-pkg/indexcopy.cc:268 apt-pkg/indexcopy.cc:835
+#: apt-pkg/indexcopy.cc:268 apt-pkg/indexcopy.cc:835
 #, c-format
 msgid "Wrote %i records with %i mismatched files\n"
 msgstr ""
 
-#: apt-pkg/indexcopy.cc:269 apt-pkg/indexcopy.cc:271 apt-pkg/indexcopy.cc:838
+#: apt-pkg/indexcopy.cc:271 apt-pkg/indexcopy.cc:838
 #, c-format
 msgid "Wrote %i records with %i missing files and %i mismatched files\n"
 msgstr ""
@@ -2576,28 +2613,3 @@ msgstr ""
 #: methods/rsh.cc:330
 msgid "Connection closed prematurely"
 msgstr ""
-
-#: apt-pkg/pkgcache.cc:231
-msgid "Breaks"
-msgstr ""
-
-#: apt-pkg/pkgcachegen.cc:157
-#, c-format
-msgid "Error occured while processing %s (NewFileDesc1)"
-msgstr ""
-
-#: apt-pkg/pkgcachegen.cc:249
-#, c-format
-msgid "Error occured while processing %s (NewFileDesc2)"
-msgstr ""
-
-#: apt-pkg/pkgcachegen.cc:261
-msgid "Wow, you exceeded the number of descriptions this APT is capable of."
-msgstr ""
-
-#: apt-pkg/cdrom.cc:673
-#, c-format
-msgid ""
-"Found %i package indexes, %i source indexes, %i translation indexes and %i "
-"signatures\n"
-msgstr ""