]> git.saurik.com Git - apt.git/commitdiff
* merged with apt--mvo--0 and apt--ddtp--0
authorMichael Vogt <mvo@debian.org>
Sun, 23 Oct 2005 10:08:41 +0000 (10:08 +0000)
committerMichael Vogt <mvo@debian.org>
Sun, 23 Oct 2005 10:08:41 +0000 (10:08 +0000)
Patches applied:

 * michael.vogt@ubuntu.com--2005/apt--ddtp--0--patch-19
   * ABI/API change: add "VerIterator::TranslatedDescription()" method to make the life of the api user easier

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-78
   * fix a incorrect example

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-79
   * revert patch from patch-59, causes all sorts of trouble

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-80
   * fix changelog

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-81
   * be extra carefull in cmdline/apt-get.cc:FindSrc() and check VF.File() for NULL

15 files changed:
apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
apt-pkg/deb/debmetaindex.cc
apt-pkg/init.h
apt-pkg/pkgrecords.cc
apt-pkg/pkgrecords.h
cmdline/apt-get.cc
configure.in
debian/changelog
doc/apt_preferences.5.xml
doc/examples/configure-index
methods/http.cc
methods/makefile
methods/rred.cc [new file with mode: 0644]
po/apt-all.pot

index e0e0611f04e94dc527be17c21ecef7cd5c28f164..75a7faa2acc333afbd7362dfd6f9de4642557dc0 100644 (file)
@@ -24,6 +24,8 @@
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/md5.h>
+#include <apt-pkg/sha1.h>
+#include <apt-pkg/tagfile.h>
 
 #include <apti18n.h>
     
@@ -31,6 +33,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <string>
+#include <sstream>
 #include <stdio.h>
                                                                        /*}}}*/
 
@@ -131,14 +134,410 @@ void pkgAcquire::Item::Rename(string From,string To)
 }
                                                                        /*}}}*/
 
+
+// AcqDiffIndex::AcqDiffIndex - Constructor                    
+// ---------------------------------------------------------------------
+/* Get the DiffIndex file first and see if there are patches availabe 
+ * If so, create a pkgAcqIndexDiffs fetcher that will get and apply the
+ * patches. If anything goes wrong in that process, it will fall back to
+ * the original packages file
+ */
+pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
+                                string URI,string URIDesc,string ShortDesc,
+                                string ExpectedMD5)
+   : Item(Owner), RealURI(URI), ExpectedMD5(ExpectedMD5), Description(URIDesc)
+{
+   
+   Debug = _config->FindB("Debug::pkgAcquire::Diffs",false);
+
+   Desc.Description = URIDesc + "/DiffIndex";
+   Desc.Owner = this;
+   Desc.ShortDesc = ShortDesc;
+   Desc.URI = URI + ".diff/Index";
+
+   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
+   DestFile += URItoFileName(URI) + string(".DiffIndex");
+
+   if(Debug)
+      std::clog << "pkgAcqDiffIndex: " << Desc.URI << std::endl;
+
+   // look for the current package file
+   CurrentPackagesFile = _config->FindDir("Dir::State::lists");
+   CurrentPackagesFile += URItoFileName(RealURI);
+
+   if(!FileExists(CurrentPackagesFile) || 
+      !_config->FindB("Acquire::Diffs",true)) {
+      // we don't have a pkg file or we don't want to queue
+      if(Debug)
+        std::clog << "No index file or canceld by user" << std::endl;
+      Failed("", NULL);
+      return;
+   }
+
+   if(Debug) {
+      std::clog << "pkgAcqIndexDiffs::pkgAcqIndexDiffs(): " 
+               << CurrentPackagesFile << std::endl;
+   }
+
+   QueueURI(Desc);
+
+}
+
+// AcqIndex::Custom600Headers - Insert custom request headers          /*{{{*/
+// ---------------------------------------------------------------------
+/* The only header we use is the last-modified header. */
+string pkgAcqDiffIndex::Custom600Headers()
+{
+   string Final = _config->FindDir("Dir::State::lists");
+   Final += URItoFileName(RealURI) + string(".IndexDiff");
+   
+   if(Debug)
+      std::clog << "Custom600Header-IMS: " << Final << std::endl;
+
+   struct stat Buf;
+   if (stat(Final.c_str(),&Buf) != 0)
+      return "\nIndex-File: true";
+   
+   return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+}
+
+
+bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile)
+{
+   if(Debug)
+      std::clog << "pkgAcqIndexDiffs::ParseIndexDiff() " << IndexDiffFile 
+               << std::endl;
+
+   pkgTagSection Tags;
+   string ServerSha1;
+   vector<DiffInfo> available_patches;
+   
+   FileFd Fd(IndexDiffFile,FileFd::ReadOnly);
+   pkgTagFile TF(&Fd);
+   if (_error->PendingError() == true)
+      return false;
+
+   if(TF.Step(Tags) == true)
+   {
+      string local_sha1;
+      bool found = false;
+      DiffInfo d;
+      string size;
+
+      string tmp = Tags.FindS("SHA1-Current");
+      std::stringstream ss(tmp);
+      ss >> ServerSha1;
+
+      FileFd fd(CurrentPackagesFile, FileFd::ReadOnly);
+      SHA1Summation SHA1;
+      SHA1.AddFD(fd.Fd(), fd.Size());
+      local_sha1 = string(SHA1.Result());
+
+      if(local_sha1 == ServerSha1) {
+        if(Debug)
+           std::clog << "Package file is up-to-date" << std::endl;
+        // set found to true, this will queue a pkgAcqIndexDiffs with
+        // a empty availabe_patches
+        found = true;
+      } else {
+        if(Debug)
+           std::clog << "SHA1-Current: " << ServerSha1 << std::endl;
+
+        // check the historie and see what patches we need
+        string history = Tags.FindS("SHA1-History");     
+        std::stringstream hist(history);
+        while(hist >> d.sha1 >> size >> d.file) {
+           d.size = atoi(size.c_str());
+           // read until the first match is found
+           if(d.sha1 == local_sha1) 
+              found=true;
+           // from that point on, we probably need all diffs
+           if(found) {
+              if(Debug)
+                 std::clog << "Need to get diff: " << d.file << std::endl;
+              available_patches.push_back(d);
+           }
+        }
+      }
+
+      // no information how to get the patches, bail out
+      if(!found) {
+        if(Debug)
+           std::clog << "Can't find a patch in the index file" << std::endl;
+        // Failed will queue a big package file
+        Failed("", NULL);
+      } else {
+        // queue the diffs
+        new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc,
+                             ExpectedMD5, available_patches);
+        Complete = false;
+        Status = StatDone;
+        Dequeue();
+        return true;
+      }
+   }
+
+   return false;
+}
+
+void pkgAcqDiffIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
+{
+   if(Debug)
+      std::clog << "pkgAcqDiffIndex failed: " << Desc.URI << std::endl
+               << "Falling back to normal index file aquire" << std::endl;
+
+   new pkgAcqIndex(Owner, RealURI, Description, Desc.ShortDesc, 
+                  ExpectedMD5);
+
+   Complete = false;
+   Status = StatDone;
+   Dequeue();
+}
+
+void pkgAcqDiffIndex::Done(string Message,unsigned long Size,string Md5Hash,
+                          pkgAcquire::MethodConfig *Cnf)
+{
+   if(Debug)
+      std::clog << "pkgAcqDiffIndex::Done(): " << Desc.URI << std::endl;
+
+   Item::Done(Message,Size,Md5Hash,Cnf);
+
+   string FinalFile;
+   FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI);
+
+   // sucess in downloading the index
+   // rename the index
+   FinalFile += string(".IndexDiff");
+   if(Debug)
+      std::clog << "Renaming: " << DestFile << " -> " << FinalFile 
+               << std::endl;
+   Rename(DestFile,FinalFile);
+   chmod(FinalFile.c_str(),0644);
+   DestFile = FinalFile;
+
+   if(!ParseDiffIndex(DestFile))
+      return Failed("", NULL);
+
+   Complete = true;
+   Status = StatDone;
+   Dequeue();
+   return;
+}
+
+
+
+// AcqIndexDiffs::AcqIndexDiffs - Constructor                  
+// ---------------------------------------------------------------------
+/* The package diff is added to the queue. one object is constructed
+ * for each diff and the index
+ */
+pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner,
+                                  string URI,string URIDesc,string ShortDesc,
+                                  string ExpectedMD5, vector<DiffInfo> diffs)
+   : Item(Owner), RealURI(URI), ExpectedMD5(ExpectedMD5), 
+     available_patches(diffs)
+{
+   
+   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
+   DestFile += URItoFileName(URI);
+
+   Debug = _config->FindB("Debug::pkgAcquire::Diffs",false);
+
+   Desc.Description = URIDesc;
+   Desc.Owner = this;
+   Desc.ShortDesc = ShortDesc;
+
+   if(available_patches.size() == 0) {
+      // we are done (yeah!)
+      Finish(true);
+   } else {
+      // get the next diff
+      State = StateFetchDiff;
+      QueueNextDiff();
+   }
+}
+
+
+void pkgAcqIndexDiffs::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
+{
+   if(Debug)
+      std::clog << "pkgAcqIndexDiffs failed: " << Desc.URI << std::endl
+               << "Falling back to normal index file aquire" << std::endl;
+   new pkgAcqIndex(Owner, RealURI, Description,Desc.ShortDesc, 
+                  ExpectedMD5);
+   Finish();
+}
+
+
+// helper that cleans the item out of the fetcher queue
+void pkgAcqIndexDiffs::Finish(bool allDone)
+{
+   // we restore the original name, this is required, otherwise
+   // the file will be cleaned
+   if(allDone) {
+      DestFile = _config->FindDir("Dir::State::lists");
+      DestFile += URItoFileName(RealURI);
+
+      // do the final md5sum checking
+      MD5Summation sum;
+      FileFd Fd(DestFile, FileFd::ReadOnly);
+      sum.AddFD(Fd.Fd(), Fd.Size());
+      Fd.Close();
+      string MD5 = (string)sum.Result();
+
+      if (!ExpectedMD5.empty() && MD5 != ExpectedMD5)
+      {
+        Status = StatAuthError;
+        ErrorText = _("MD5Sum mismatch");
+        Rename(DestFile,DestFile + ".FAILED");
+        Dequeue();
+        return;
+      }
+
+      // this is for the "real" finish
+      Complete = true;
+      Status = StatDone;
+      Dequeue();
+      if(Debug)
+        std::clog << "\n\nallDone: " << DestFile << "\n" << std::endl;
+      return;
+   }
+
+   if(Debug)
+      std::clog << "Finishing: " << Desc.URI << std::endl;
+   Complete = false;
+   Status = StatDone;
+   Dequeue();
+   return;
+}
+
+
+
+bool pkgAcqIndexDiffs::QueueNextDiff()
+{
+
+   // calc sha1 of the just patched file
+   string FinalFile = _config->FindDir("Dir::State::lists");
+   FinalFile += URItoFileName(RealURI);
+
+   FileFd fd(FinalFile, FileFd::ReadOnly);
+   SHA1Summation SHA1;
+   SHA1.AddFD(fd.Fd(), fd.Size());
+   string local_sha1 = string(SHA1.Result());
+   if(Debug)
+      std::clog << "QueueNextDiff: " 
+               << FinalFile << " (" << local_sha1 << ")"<<std::endl;
+
+   // remove all patches until the next matching patch is found
+   // this requires the Index file to be ordered
+   for(vector<DiffInfo>::iterator I=available_patches.begin();
+       available_patches.size() > 0 && I != available_patches.end() 
+         && (*I).sha1 != local_sha1; 
+       I++) {
+      available_patches.erase(I);
+   }
+
+   // error checking and falling back if no patch was found
+   if(available_patches.size() == 0) { 
+      Failed("", NULL);
+      return false;
+   }
+
+   // queue the right diff
+   Desc.URI = string(RealURI) + ".diff/" + available_patches[0].file + ".gz";
+   Desc.Description = available_patches[0].file + string(".pdiff");
+
+   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
+   DestFile += URItoFileName(RealURI + ".diff/" + available_patches[0].file);
+
+   if(Debug)
+      std::clog << "pkgAcqIndexDiffs::QueueNextDiff(): " << Desc.URI << std::endl;
+   
+   QueueURI(Desc);
+
+   return true;
+}
+
+
+
+void pkgAcqIndexDiffs::Done(string Message,unsigned long Size,string Md5Hash,
+                           pkgAcquire::MethodConfig *Cnf)
+{
+   if(Debug)
+      std::clog << "pkgAcqIndexDiffs::Done(): " << Desc.URI << std::endl;
+
+   Item::Done(Message,Size,Md5Hash,Cnf);
+
+   string FinalFile;
+   FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI);
+
+   // sucess in downloading a diff, enter ApplyDiff state
+   if(State == StateFetchDiff) 
+   {
+
+      if(Debug)
+        std::clog << "Sending to gzip method: " << FinalFile << std::endl;
+
+      string FileName = LookupTag(Message,"Filename");
+      State = StateUnzipDiff;
+      Desc.URI = "gzip:" + FileName;
+      DestFile += ".decomp";
+      QueueURI(Desc);
+      Mode = "gzip";
+      return;
+   } 
+
+   // sucess in downloading a diff, enter ApplyDiff state
+   if(State == StateUnzipDiff) 
+   {
+
+      // rred excepts the patch as $FinalFile.ed
+      Rename(DestFile,FinalFile+".ed");
+
+      if(Debug)
+        std::clog << "Sending to rred method: " << FinalFile << std::endl;
+
+      State = StateApplyDiff;
+      Desc.URI = "rred:" + FinalFile;
+      QueueURI(Desc);
+      Mode = "rred";
+      return;
+   } 
+
+
+   // success in download/apply a diff, queue next (if needed)
+   if(State == StateApplyDiff)
+   {
+      // remove the just applied patch
+      available_patches.erase(available_patches.begin());
+
+      // move into place
+      if(Debug) 
+      {
+        std::clog << "Moving patched file in place: " << std::endl
+                  << DestFile << " -> " << FinalFile << std::endl;
+      }
+      Rename(DestFile,FinalFile);
+
+      // see if there is more to download
+      if(available_patches.size() > 0) {
+        new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc,
+                             ExpectedMD5, available_patches);
+        return Finish();
+      } else 
+        return Finish(true);
+   }
+}
+
+
 // AcqIndex::AcqIndex - Constructor                                    /*{{{*/
 // ---------------------------------------------------------------------
 /* The package file is added to the queue and a second class is 
    instantiated to fetch the revision file */   
 pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
                         string URI,string URIDesc,string ShortDesc,
-                        string ExpectedMD5, string comprExt) :
-   Item(Owner), RealURI(URI), ExpectedMD5(ExpectedMD5)
+                        string ExpectedMD5, string comprExt)
+   Item(Owner), RealURI(URI), ExpectedMD5(ExpectedMD5)
 {
    Decompression = false;
    Erase = false;
@@ -636,8 +1035,8 @@ void pkgAcqMetaIndex::QueueIndexes(bool verify)
       }
       
       // Queue Packages file
-      new pkgAcqIndex(Owner, (*Target)->URI, (*Target)->Description,
-                      (*Target)->ShortDesc, ExpectedIndexMD5);
+      new pkgAcqDiffIndex(Owner, (*Target)->URI, (*Target)->Description,
+                         (*Target)->ShortDesc, ExpectedIndexMD5);
    }
 }
 
index ae2fba4d589009dd5eac12f173ee902b4b2b6911..34fcc2a768278f64e6e2145efc868335b0e6daf9 100644 (file)
@@ -82,6 +82,70 @@ class pkgAcquire::Item
    virtual ~Item();
 };
 
+// item for index diffs
+
+struct DiffInfo {
+   string file;
+   string sha1;
+   unsigned long size;
+};
+
+class pkgAcqDiffIndex : public pkgAcquire::Item
+{
+ protected:
+   bool Debug;
+   pkgAcquire::ItemDesc Desc;
+   string RealURI;
+   string ExpectedMD5;
+   string CurrentPackagesFile;
+   string Description;
+
+ public:
+   // Specialized action members
+   virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
+   virtual void Done(string Message,unsigned long Size,string Md5Hash,
+                    pkgAcquire::MethodConfig *Cnf);
+   virtual string DescURI() {return RealURI + "Index";};
+   virtual string Custom600Headers();
+
+   // helpers
+   bool ParseDiffIndex(string IndexDiffFile);
+   
+   pkgAcqDiffIndex(pkgAcquire *Owner,string URI,string URIDesc,
+                  string ShortDesct, string ExpectedMD5);
+};
+
+class pkgAcqIndexDiffs : public pkgAcquire::Item
+{
+   protected:
+   bool Debug;
+   pkgAcquire::ItemDesc Desc;
+   string RealURI;
+   string ExpectedMD5;
+
+   // this is the SHA-1 sum we expect after the patching
+   string Description;
+   vector<DiffInfo> available_patches;
+   enum {StateFetchIndex,StateFetchDiff,StateUnzipDiff,StateApplyDiff} State;
+
+   public:
+   
+   // Specialized action members
+   virtual void Failed(string Message,pkgAcquire::MethodConfig *Cnf);
+   virtual void Done(string Message,unsigned long Size,string Md5Hash,
+                    pkgAcquire::MethodConfig *Cnf);
+   virtual string DescURI() {return RealURI + "Index";};
+
+   // various helpers
+   bool QueueNextDiff();
+   bool ApplyDiff(string PatchFile);
+   void Finish(bool allDone=false);
+
+   pkgAcqIndexDiffs(pkgAcquire *Owner,string URI,string URIDesc,
+                   string ShortDesct, string ExpectedMD5,
+                   vector<DiffInfo> diffs=vector<DiffInfo>());
+};
+
 // Item class for index files
 class pkgAcqIndex : public pkgAcquire::Item
 {
index ea53a847ef194bca314460d3e65666f6cedca4bb..d3b6ed957181941e5b28d431e71410c354419c2f 100644 (file)
@@ -173,7 +173,7 @@ bool debReleaseIndex::IsTrusted() const
    string VerifiedSigFile = _config->FindDir("Dir::State::lists") +
       URItoFileName(MetaIndexURI("Release")) + ".gpg";
    
-   if(_config->FindB("APT::Authentication::Trust-CDROM", false))
+   if(_config->FindB("APT::Authentication::TrustCDROM", false))
       if(URI.substr(0,strlen("cdrom:")) == "cdrom:")
         return true;
    
index e213517971b85551642c0063df1ffc84acc48ad5..8255b406a6bd65d694ef7cdd68d2adda2ad6b54b 100644 (file)
@@ -18,7 +18,7 @@
 
 // See the makefile
 #define APT_PKG_MAJOR 3
-#define APT_PKG_MINOR 10
+#define APT_PKG_MINOR 11
 #define APT_PKG_RELEASE 0
     
 extern const char *pkgVersion;
index f62f945b5b03cb8c14e9072bb6901498ca37ef91..b22f3e73fc80ccf6ffe2943529f17aaa30561102 100644 (file)
@@ -42,9 +42,6 @@ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0)
       if (Files[I->ID] == 0)
         return;
    }   
-   // We store that to make sure that the destructor won't segfault,
-   // even if the Cache object was destructed before this instance.
-   PackageFileCount = Cache.HeaderP->PackageFileCount;
 }
                                                                        /*}}}*/
 // Records::~pkgRecords - Destructor                                   /*{{{*/
@@ -52,7 +49,7 @@ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0)
 /* */
 pkgRecords::~pkgRecords()
 {
-   for (unsigned I = 0; I != PackageFileCount; I++)
+   for (unsigned I = 0; I != Cache.HeaderP->PackageFileCount; I++)
       delete Files[I];
    delete [] Files;
 }
index ece91680e518e3daf3b86cd912ded17c35bc7128..31c444dbf9c82becf1cdde4fbf94be5eea74d890 100644 (file)
@@ -33,7 +33,6 @@ class pkgRecords
    
    pkgCache &Cache;
    Parser **Files;
-   int PackageFileCount;
       
    public:
 
index 3475d79aed757f9f1dfd71e5ff344c982c22e46d..040f670b1f051aff0953fec6fb3be40571fafc4c 100644 (file)
@@ -1200,7 +1200,7 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
       VerTag = string(TmpSrc.begin() + Slash + 1,TmpSrc.end());
       TmpSrc = string(TmpSrc.begin(),TmpSrc.begin() + Slash);
    } 
-   else  if(DefRel.empty() == false) 
+   else  if(DefRel.empty() == false)
    {
       // we have a default release, try to locate the pkg. we do it like
       // this because GetCandidateVer() will not "downgrade", that means
@@ -1211,6 +1211,10 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
         for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false;
              VF++)
         {
+           // extra paranioa
+           if(VF.File() == NULL)
+              continue;
+
            /* If this is the status file, and the current version is not the
               version in the status file (ie it is not installed, or somesuch)
               then it is not a candidate for installation, ever. This weeds
index 87dac8e47e7c4741a8f02815b351885513f60232..758727f2f21a0a342f0d896ff26db8c7a443afcc 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.41.1")
+AC_DEFINE_UNQUOTED(VERSION,"0.6.42.1")
 PACKAGE="apt"
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_SUBST(PACKAGE)
index 0e85b511793c5e3815388673fe1440ad71606052..b854d174198dd8e0846069c9c72cc5d6f081fa7f 100644 (file)
@@ -1,3 +1,25 @@
+apt (0.6.42.1exp1) experimental; urgency=low
+
+  * added support for package index diffs 
+  * added support for i18n of the package descriptions
+  * synced with the apt--debian-sid--0 branch
+  * build from mvo@debian.org--2005/apt--debian-experimental--0
+    (from http://people.debian.org/~mvo/arch)
+
+ -- Michael Vogt <mvo@debian.org>  Wed, 19 Oct 2005 22:12:13 +0200
+
+apt (0.6.42.1) unstable; urgency=low
+
+  * fix a incorrect example in the apt_prefrences man page
+    (thanks to Filipus Klutiero, closes: #282918)
+  * apt-pkg/pkgrecords.cc:
+    - revert patch from last version, it causes trouble on alpha 
+      and ia64 (closes: #335102, #335103)
+  * cmdline/apt-get.cc:
+    - be extra carefull in FindSrc (closes: #335213)
+
+ -- Michael Vogt <mvo@debian.org>  Sat, 22 Oct 2005 23:44:35 +0200
+
 apt (0.6.42) unstable; urgency=low
 
   * apt-pkg/cdrom.cc:
@@ -17,7 +39,7 @@ apt (0.6.42) unstable; urgency=low
   * fix leak in the mmap code, thanks to Daniel Burrows for the
     patch (closes: #250583)
   * support for apt-get [build-dep|source] -t (closes: #152129)
-  * added "APT::Authentication::Trust-CDROM" option to make the life
+  * added "APT::Authentication::TrustCDROM" option to make the life
     for the installer people easier (closes: #334656)
   * fix crash in apt-ftparchive (thanks to Bastian Blank for the patch)
     (closes: #334671)
@@ -29,7 +51,7 @@ apt (0.6.42) unstable; urgency=low
   * cmdline/apt-cdrom.cc: 
     - fix some missing gettext() calls (closes: #334539)
   * doc/apt-cache.8.xml: fix typo (closes: #334714)
-  
+
  -- Michael Vogt <mvo@debian.org>  Wed, 19 Oct 2005 22:02:09 +0200
 
 apt (0.6.41) unstable; urgency=low
index 12b03196a80c0247c9e7fe0689dec00d519310df..3e50bef8c1696c1a07aad1344b196d95b33fbc96 100644 (file)
@@ -183,7 +183,7 @@ belonging to any distribution whose Archive name is "<literal>unstable</literal>
 <programlisting>
 Package: *
 Pin: release a=unstable
-Pin-Priority: 500
+Pin-Priority: 50
 </programlisting>
 
 <simpara>The following record assigns a high priority to all package versions
index 5ab84fe05dac49a500f687a94995ec0f8437af0c..a93b743492fade6c31f585d58fb73b4f554e8131 100644 (file)
@@ -74,7 +74,7 @@ APT
 
   Authentication
   {
-     Trust-CDROM "false";            // consider the CDROM always trusted
+     TrustCDROM "false";            // consider the CDROM always trusted
   };
 
   GPGV
index ba86aa6b654904a4579e397be946d509cb4c7e3a..e2337a9ba3459d1110a15e98a5f5c4591fa1c8fc 100644 (file)
@@ -58,6 +58,7 @@ unsigned long PipelineDepth = 10;
 unsigned long TimeOut = 120;
 bool Debug = false;
 
+
 // CircleBuf::CircleBuf - Circular input buffer                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -95,7 +96,7 @@ bool CircleBuf::Read(int Fd)
       // Woops, buffer is full
       if (InP - OutP == Size)
         return true;
-      
+
       // Write the buffer segment
       int Res;
       Res = read(Fd,Buf + (InP%Size),LeftRead());
index 1e3b1ef850b128f8fd97ec77c7442cced44a0e34..d0b5a28c0210cadb478b2cb78a315b11943c2891 100644 (file)
@@ -59,6 +59,13 @@ LIB_MAKES = apt-pkg/makefile
 SOURCE = ftp.cc rfc2553emu.cc connect.cc
 include $(PROGRAM_H)
 
+# The rred method
+PROGRAM=rred
+SLIBS = -lapt-pkg $(SOCKETLIBS)
+LIB_MAKES = apt-pkg/makefile
+SOURCE = rred.cc
+include $(PROGRAM_H)
+
 # The rsh method
 PROGRAM=rsh
 SLIBS = -lapt-pkg
diff --git a/methods/rred.cc b/methods/rred.cc
new file mode 100644 (file)
index 0000000..6fa57f3
--- /dev/null
@@ -0,0 +1,262 @@
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/acquire-method.h>
+#include <apt-pkg/strutl.h>
+#include <apt-pkg/hashes.h>
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <utime.h>
+#include <stdio.h>
+#include <errno.h>
+#include <apti18n.h>
+
+/* this method implements a patch functionality similar to "patch --ed" that is
+ * used by the "tiffany" incremental packages download stuff. it differs from 
+ * "ed" insofar that it is way more restricted (and therefore secure). in the
+ * moment only the "c", "a" and "d" commands of ed are implemented (diff 
+ * doesn't output any other). additionally the records must be reverse sorted 
+ * by line number and may not overlap (diff *seems* to produce this kind of 
+ * output). 
+ * */
+
+const char *Prog;
+
+class RredMethod : public pkgAcqMethod
+{
+   bool Debug;
+   // the size of this doesn't really matter (except for performance)    
+   const static int BUF_SIZE = 1024;
+   // the ed commands
+   enum Mode {MODE_CHANGED, MODE_DELETED, MODE_ADDED};
+   // return values
+   enum State {ED_OK, ED_ORDERING, ED_PARSER, ED_FAILURE};
+   // this applies a single hunk, it uses a tail recursion to 
+   // reverse the hunks in the file
+   int ed_rec(FILE *ed_cmds, FILE *in_file, FILE *out_file, int line, 
+      char *buffer, unsigned int bufsize, Hashes *hash);
+   // apply a patch file
+   int ed_file(FILE *ed_cmds, FILE *in_file, FILE *out_file, Hashes *hash);
+   // the methods main method
+   virtual bool Fetch(FetchItem *Itm);
+   
+   public:
+   
+   RredMethod() : pkgAcqMethod("1.1",SingleInstance | SendConfig) {};
+};
+
+int RredMethod::ed_rec(FILE *ed_cmds, FILE *in_file, FILE *out_file, int line, 
+      char *buffer, unsigned int bufsize, Hashes *hash) {
+   int pos;
+   int startline;
+   int stopline;
+   int mode;
+   int written;
+   char *idx;
+
+   /* get the current command and parse it*/
+   if (fgets(buffer, bufsize, ed_cmds) == NULL) {
+      return line;
+   }
+   startline = strtol(buffer, &idx, 10);
+   if (startline < line) {
+      return ED_ORDERING;
+   }
+   if (*idx == ',') {
+      idx++;
+      stopline = strtol(idx, &idx, 10);
+   }
+   else {
+      stopline = startline;
+   }
+   if (*idx == 'c') {
+      mode = MODE_CHANGED;
+          if (Debug == true) {
+                  std::clog << "changing from line " << startline 
+                            << " to " << stopline << std::endl;
+          }
+   }
+   else if (*idx == 'a') {
+      mode = MODE_ADDED;
+          if (Debug == true) {
+                  std::clog << "adding after line " << startline << std::endl;
+          }
+   }
+   else if (*idx == 'd') {
+      mode = MODE_DELETED;
+          if (Debug == true) {
+                  std::clog << "deleting from line " << startline 
+                            <<  " to " << stopline << std::endl;
+          }
+   }
+   else {
+      return ED_PARSER;
+   }
+   /* get the current position */
+   pos = ftell(ed_cmds);
+   /* if this is add or change then go to the next full stop */
+   if ((mode == MODE_CHANGED) || (mode == MODE_ADDED)) {
+      do {
+         fgets(buffer, bufsize, ed_cmds);
+         while ((strlen(buffer) == (bufsize - 1)) 
+               && (buffer[bufsize - 2] != '\n')) {
+            fgets(buffer, bufsize, ed_cmds);
+            buffer[0] = ' ';
+         }
+      } while (strncmp(buffer, ".", 1) != 0);
+   }
+   /* do the recursive call */
+   line = ed_rec(ed_cmds, in_file, out_file, line, buffer, bufsize, 
+         hash);
+   /* pass on errors */
+   if (line < 0) {
+      return line;
+   }
+   /* apply our hunk */
+   fseek(ed_cmds, pos, SEEK_SET); 
+   /* first wind to the current position */
+   if (mode != MODE_ADDED) {
+      startline -= 1;
+   }
+   while (line < startline) {
+      fgets(buffer, bufsize, in_file);
+      written = fwrite(buffer, 1, strlen(buffer), out_file);
+      hash->Add((unsigned char*)buffer, written);
+      while ((strlen(buffer) == (bufsize - 1)) 
+            && (buffer[bufsize - 2] != '\n')) {
+         fgets(buffer, bufsize, in_file);
+         written = fwrite(buffer, 1, strlen(buffer), out_file);
+         hash->Add((unsigned char*)buffer, written);
+      }
+      line++;
+   }
+   /* include from ed script */
+   if ((mode == MODE_ADDED) || (mode == MODE_CHANGED)) {
+      do {
+         fgets(buffer, bufsize, ed_cmds);
+         if (strncmp(buffer, ".", 1) != 0) {
+            written = fwrite(buffer, 1, strlen(buffer), out_file);
+            hash->Add((unsigned char*)buffer, written);
+            while ((strlen(buffer) == (bufsize - 1)) 
+                  && (buffer[bufsize - 2] != '\n')) {
+               fgets(buffer, bufsize, ed_cmds);
+               written = fwrite(buffer, 1, strlen(buffer), out_file);
+               hash->Add((unsigned char*)buffer, written);
+            }
+         }
+         else {
+            break;
+         }
+      } while (1);
+   }
+   /* ignore the corresponding number of lines from input */
+   if ((mode == MODE_DELETED) || (mode == MODE_CHANGED)) {
+      while (line < stopline) {
+         fgets(buffer, bufsize, in_file);
+         while ((strlen(buffer) == (bufsize - 1)) 
+               && (buffer[bufsize - 2] != '\n')) {
+            fgets(buffer, bufsize, in_file);
+         }
+         line++;
+      }
+   }
+   return line;
+}
+
+int RredMethod::ed_file(FILE *ed_cmds, FILE *in_file, FILE *out_file, 
+      Hashes *hash) {
+   char buffer[BUF_SIZE];
+   int result;
+   int written;
+   
+   /* we do a tail recursion to read the commands in the right order */
+   result = ed_rec(ed_cmds, in_file, out_file, 0, buffer, BUF_SIZE, 
+         hash);
+   
+   /* read the rest from infile */
+   if (result > 0) {
+      while (fgets(buffer, BUF_SIZE, in_file) != NULL) {
+         written = fwrite(buffer, 1, strlen(buffer), out_file);
+         hash->Add((unsigned char*)buffer, written);
+      }
+   }
+   else {
+      return ED_FAILURE;
+   }
+   return ED_OK;
+}
+
+
+bool RredMethod::Fetch(FetchItem *Itm)
+{
+   Debug = _config->FindB("Debug::pkgAcquire::RRed",false);
+   URI Get = Itm->Uri;
+   string Path = Get.Host + Get.Path; // To account for relative paths
+   // Path contains the filename to patch
+   FetchResult Res;
+   Res.Filename = Itm->DestFile;
+   URIStart(Res);
+   // Res.Filename the destination filename
+
+   if (Debug == true) 
+      std::clog << "Patching " << Path << " with " << Path 
+         << ".ed and putting result into " << Itm->DestFile << std::endl;
+   // Open the source and destination files (the d'tor of FileFd will do 
+   // the cleanup/closing of the fds)
+   FileFd From(Path,FileFd::ReadOnly);
+   FileFd Patch(Path+".ed",FileFd::ReadOnly);
+   FileFd To(Itm->DestFile,FileFd::WriteEmpty);   
+   To.EraseOnFailure();
+   if (_error->PendingError() == true)
+      return false;
+   
+   Hashes Hash;
+   FILE* fFrom = fdopen(From.Fd(), "r");
+   FILE* fPatch = fdopen(Patch.Fd(), "r");
+   FILE* fTo = fdopen(To.Fd(), "w");
+   // now do the actual patching
+   if (ed_file(fPatch, fFrom, fTo, &Hash) != ED_OK) {
+     _error->Errno("rred", _("Could not patch file"));  
+      return false;
+   }
+
+   // write out the result
+   fflush(fFrom);
+   fflush(fPatch);
+   fflush(fTo);
+   From.Close();
+   Patch.Close();
+   To.Close();
+
+   // Transfer the modification times
+   struct stat Buf;
+   if (stat(Path.c_str(),&Buf) != 0)
+      return _error->Errno("stat",_("Failed to stat"));
+
+   struct utimbuf TimeBuf;
+   TimeBuf.actime = Buf.st_atime;
+   TimeBuf.modtime = Buf.st_mtime;
+   if (utime(Itm->DestFile.c_str(),&TimeBuf) != 0)
+      return _error->Errno("utime",_("Failed to set modification time"));
+
+   if (stat(Itm->DestFile.c_str(),&Buf) != 0)
+      return _error->Errno("stat",_("Failed to stat"));
+
+   // return done
+   Res.LastModified = Buf.st_mtime;
+   Res.Size = Buf.st_size;
+   Res.TakeHashes(Hash);
+   URIDone(Res);
+
+   return true;
+}
+
+int main(int argc, char *argv[])
+{
+   RredMethod Mth;
+
+   Prog = strrchr(argv[0],'/');
+   Prog++;
+   
+   return Mth.Run();
+}
index 1caf832f0b9c3c349c8d63b841f53ff5ec59bd53..541a90df494262c2b3e59614ca79eab2b9fe4d62 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2005-09-22 23:07+0200\n"
+"POT-Creation-Date: 2005-10-17 19:31+0200\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:141
 #, 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:181 cmdline/apt-cache.cc:550 cmdline/apt-cache.cc:638
+#: cmdline/apt-cache.cc:794 cmdline/apt-cache.cc:1012
+#: 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:245
 msgid "Total package names : "
 msgstr ""
 
-#: cmdline/apt-cache.cc:272
+#: cmdline/apt-cache.cc:285
 msgid "  Normal packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:273
+#: cmdline/apt-cache.cc:286
 msgid "  Pure virtual packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:274
+#: cmdline/apt-cache.cc:287
 msgid "  Single virtual packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:275
+#: cmdline/apt-cache.cc:288
 msgid "  Mixed virtual packages: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:276
+#: cmdline/apt-cache.cc:289
 msgid "  Missing: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:278
+#: cmdline/apt-cache.cc:291
 msgid "Total distinct versions: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:280
+#: cmdline/apt-cache.cc:293
+msgid "Total Distinct Descriptions: "
+msgstr ""
+
+#: cmdline/apt-cache.cc:295
 msgid "Total dependencies: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:283
+#: cmdline/apt-cache.cc:298
 msgid "Total ver/file relations: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:285
+#: cmdline/apt-cache.cc:300
+msgid "Total Desc/File relations: "
+msgstr ""
+
+#: cmdline/apt-cache.cc:302
 msgid "Total Provides mappings: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:297
+#: cmdline/apt-cache.cc:314
 msgid "Total globbed strings: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:311
+#: cmdline/apt-cache.cc:328
 msgid "Total dependency version space: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:316
+#: cmdline/apt-cache.cc:333
 msgid "Total slack space: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:324
+#: cmdline/apt-cache.cc:341
 msgid "Total space accounted for: "
 msgstr ""
 
-#: cmdline/apt-cache.cc:446 cmdline/apt-cache.cc:1189
+#: cmdline/apt-cache.cc:469 cmdline/apt-cache.cc:1212
 #, 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:1651 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70
+#: cmdline/apt-cache.cc:1713 cmdline/apt-cdrom.cc:138 cmdline/apt-config.cc:70
 #: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:550
 #: cmdline/apt-get.cc:2325 cmdline/apt-sortpkgs.cc:144
 #, c-format
 msgid "%s %s for %s %s compiled on %s %s\n"
 msgstr ""
 
-#: cmdline/apt-cache.cc:1658
+#: cmdline/apt-cache.cc:1720
 msgid ""
 "Usage: apt-cache [options] command\n"
 "       apt-cache [options] add file1 [file2 ...]\n"
@@ -231,7 +239,7 @@ msgid ""
 "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
 msgstr ""
 
-#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:710
+#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:815
 #, c-format
 msgid "Unable to write to %s"
 msgstr ""
@@ -1331,9 +1339,9 @@ 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:643
-#: apt-pkg/pkgcachegen.cc:712 apt-pkg/pkgcachegen.cc:717
-#: apt-pkg/pkgcachegen.cc:840
+#: apt-inst/deb/dpkgdb.cc:139 apt-pkg/pkgcachegen.cc:748
+#: apt-pkg/pkgcachegen.cc:817 apt-pkg/pkgcachegen.cc:822
+#: apt-pkg/pkgcachegen.cc:945
 msgid "Reading package lists"
 msgstr ""
 
@@ -1466,11 +1474,12 @@ msgid "File not found"
 msgstr ""
 
 #: methods/copy.cc:42 methods/gpgv.cc:265 methods/gzip.cc:133
-#: methods/gzip.cc:142
+#: methods/gzip.cc:142 methods/rred.cc:234 methods/rred.cc:243
 msgid "Failed to stat"
 msgstr ""
 
 #: methods/copy.cc:79 methods/gpgv.cc:262 methods/gzip.cc:139
+#: methods/rred.cc:240
 msgid "Failed to set modification time"
 msgstr ""
 
@@ -1596,7 +1605,7 @@ msgstr ""
 msgid "Unable to accept connection"
 msgstr ""
 
-#: methods/ftp.cc:864 methods/http.cc:920 methods/rsh.cc:303
+#: methods/ftp.cc:864 methods/http.cc:921 methods/rsh.cc:303
 msgid "Problem hashing file"
 msgstr ""
 
@@ -1726,76 +1735,76 @@ msgstr ""
 msgid "Read error from %s process"
 msgstr ""
 
-#: methods/http.cc:344
+#: methods/http.cc:345
 msgid "Waiting for headers"
 msgstr ""
 
-#: methods/http.cc:490
+#: methods/http.cc:491
 #, c-format
 msgid "Got a single header line over %u chars"
 msgstr ""
 
-#: methods/http.cc:498
+#: methods/http.cc:499
 msgid "Bad header line"
 msgstr ""
 
-#: methods/http.cc:517 methods/http.cc:524
+#: methods/http.cc:518 methods/http.cc:525
 msgid "The HTTP server sent an invalid reply header"
 msgstr ""
 
-#: methods/http.cc:553
+#: methods/http.cc:554
 msgid "The HTTP server sent an invalid Content-Length header"
 msgstr ""
 
-#: methods/http.cc:568
+#: methods/http.cc:569
 msgid "The HTTP server sent an invalid Content-Range header"
 msgstr ""
 
-#: methods/http.cc:570
+#: methods/http.cc:571
 msgid "This HTTP server has broken range support"
 msgstr ""
 
-#: methods/http.cc:594
+#: methods/http.cc:595
 msgid "Unknown date format"
 msgstr ""
 
-#: methods/http.cc:741
+#: methods/http.cc:742
 msgid "Select failed"
 msgstr ""
 
-#: methods/http.cc:746
+#: methods/http.cc:747
 msgid "Connection timed out"
 msgstr ""
 
-#: methods/http.cc:769
+#: methods/http.cc:770
 msgid "Error writing to output file"
 msgstr ""
 
-#: methods/http.cc:797
+#: methods/http.cc:798
 msgid "Error writing to file"
 msgstr ""
 
-#: methods/http.cc:822
+#: methods/http.cc:823
 msgid "Error writing to the file"
 msgstr ""
 
-#: methods/http.cc:836
+#: methods/http.cc:837
 msgid "Error reading from server. Remote end closed connection"
 msgstr ""
 
-#: methods/http.cc:838
+#: methods/http.cc:839
 msgid "Error reading from server"
 msgstr ""
 
-#: methods/http.cc:1069
+#: methods/http.cc:1070
 msgid "Bad header data"
 msgstr ""
 
-#: methods/http.cc:1086
+#: methods/http.cc:1087
 msgid "Connection failed"
 msgstr ""
 
-#: methods/http.cc:1177
+#: methods/http.cc:1178
 msgid "Internal error"
 msgstr ""
 
@@ -1808,7 +1817,7 @@ msgstr ""
 msgid "Couldn't make mmap of %lu bytes"
 msgstr ""
 
-#: apt-pkg/contrib/strutl.cc:941
+#: apt-pkg/contrib/strutl.cc:984
 #, c-format
 msgid "Selection %s not found"
 msgstr ""
@@ -2005,72 +2014,72 @@ msgstr ""
 msgid "Problem syncing the file"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:126
+#: apt-pkg/pkgcache.cc:135
 msgid "Empty package cache"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:132
+#: apt-pkg/pkgcache.cc:141
 msgid "The package cache file is corrupted"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:137
+#: apt-pkg/pkgcache.cc:146
 msgid "The package cache file is an incompatible version"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:142
+#: apt-pkg/pkgcache.cc:151
 #, c-format
 msgid "This APT does not support the versioning system '%s'"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:147
+#: apt-pkg/pkgcache.cc:156
 msgid "The package cache was built for a different architecture"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:218
+#: apt-pkg/pkgcache.cc:227
 msgid "Depends"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:218
+#: apt-pkg/pkgcache.cc:227
 msgid "PreDepends"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:218
+#: apt-pkg/pkgcache.cc:227
 msgid "Suggests"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:219
+#: apt-pkg/pkgcache.cc:228
 msgid "Recommends"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:219
+#: apt-pkg/pkgcache.cc:228
 msgid "Conflicts"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:219
+#: apt-pkg/pkgcache.cc:228
 msgid "Replaces"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:220
+#: apt-pkg/pkgcache.cc:229
 msgid "Obsoletes"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:231
+#: apt-pkg/pkgcache.cc:240
 msgid "important"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:231
+#: apt-pkg/pkgcache.cc:240
 msgid "required"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:231
+#: apt-pkg/pkgcache.cc:240
 msgid "standard"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:232
+#: apt-pkg/pkgcache.cc:241
 msgid "optional"
 msgstr ""
 
-#: apt-pkg/pkgcache.cc:232
+#: apt-pkg/pkgcache.cc:241
 msgid "extra"
 msgstr ""
 
@@ -2126,7 +2135,7 @@ msgstr ""
 msgid "Opening %s"
 msgstr ""
 
-#: apt-pkg/sourcelist.cc:170 apt-pkg/cdrom.cc:426
+#: apt-pkg/sourcelist.cc:170 apt-pkg/cdrom.cc:450
 #, c-format
 msgid "Line %u too long in source list %s."
 msgstr ""
@@ -2205,12 +2214,12 @@ msgstr ""
 msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter."
 msgstr ""
 
-#: apt-pkg/init.cc:119
+#: apt-pkg/init.cc:122
 #, c-format
 msgid "Packaging system '%s' is not supported"
 msgstr ""
 
-#: apt-pkg/init.cc:135
+#: apt-pkg/init.cc:138
 msgid "Unable to determine a suitable packaging system type"
 msgstr ""
 
@@ -2253,106 +2262,121 @@ msgstr ""
 msgid "Error occurred while processing %s (NewPackage)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:129
+#: apt-pkg/pkgcachegen.cc:132
 #, c-format
 msgid "Error occurred while processing %s (UsePackage1)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:150
+#: apt-pkg/pkgcachegen.cc:155
+#, c-format
+msgid "Error occured while processing %s (NewFileDesc1)"
+msgstr ""
+
+#: apt-pkg/pkgcachegen.cc:180
 #, c-format
 msgid "Error occurred while processing %s (UsePackage2)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:154
+#: apt-pkg/pkgcachegen.cc:184
 #, c-format
 msgid "Error occurred while processing %s (NewFileVer1)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:184
+#: apt-pkg/pkgcachegen.cc:215
 #, c-format
 msgid "Error occurred while processing %s (NewVersion1)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:188
+#: apt-pkg/pkgcachegen.cc:219
 #, c-format
 msgid "Error occurred while processing %s (UsePackage3)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:192
+#: apt-pkg/pkgcachegen.cc:223
 #, c-format
 msgid "Error occurred while processing %s (NewVersion2)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:207
+#: apt-pkg/pkgcachegen.cc:247
+#, c-format
+msgid "Error occured while processing %s (NewFileDesc2)"
+msgstr ""
+
+#: apt-pkg/pkgcachegen.cc:253
 msgid "Wow, you exceeded the number of package names this APT is capable of."
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:210
+#: apt-pkg/pkgcachegen.cc:256
 msgid "Wow, you exceeded the number of versions this APT is capable of."
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:213
+#: apt-pkg/pkgcachegen.cc:259
+msgid "Wow, you exceeded the number of descriptions this APT is capable of."
+msgstr ""
+
+#: apt-pkg/pkgcachegen.cc:262
 msgid "Wow, you exceeded the number of dependencies this APT is capable of."
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:241
+#: apt-pkg/pkgcachegen.cc:290
 #, c-format
 msgid "Error occurred while processing %s (FindPkg)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:254
+#: apt-pkg/pkgcachegen.cc:303
 #, c-format
 msgid "Error occurred while processing %s (CollectFileProvides)"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:260
+#: apt-pkg/pkgcachegen.cc:309
 #, c-format
 msgid "Package %s %s was not found while processing file dependencies"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:574
+#: apt-pkg/pkgcachegen.cc:679
 #, c-format
 msgid "Couldn't stat source package list %s"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:658
+#: apt-pkg/pkgcachegen.cc:763
 msgid "Collecting File Provides"
 msgstr ""
 
-#: apt-pkg/pkgcachegen.cc:785 apt-pkg/pkgcachegen.cc:792
+#: apt-pkg/pkgcachegen.cc:890 apt-pkg/pkgcachegen.cc:897
 msgid "IO Error saving source cache"
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:126
+#: apt-pkg/acquire-item.cc:129
 #, c-format
 msgid "rename failed, %s (%s -> %s)."
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:236 apt-pkg/acquire-item.cc:908
+#: apt-pkg/acquire-item.cc:391 apt-pkg/acquire-item.cc:635
+#: apt-pkg/acquire-item.cc:1336
 msgid "MD5Sum mismatch"
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:722
+#: apt-pkg/acquire-item.cc:1150
 #, 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:775
+#: apt-pkg/acquire-item.cc:1203
 #, 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:811
+#: apt-pkg/acquire-item.cc:1239
 #, c-format
 msgid ""
 "The package index files are corrupted. No Filename: field for package %s."
 msgstr ""
 
-#: apt-pkg/acquire-item.cc:898
+#: apt-pkg/acquire-item.cc:1326
 msgid "Size mismatch"
 msgstr ""
 
@@ -2361,92 +2385,94 @@ msgstr ""
 msgid "Vendor block %s contains no fingerprint"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:507
+#: 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
 msgid "Identifying.. "
 msgstr ""
 
-#: apt-pkg/cdrom.cc:541
+#: apt-pkg/cdrom.cc:565
 #, c-format
 msgid "Stored label: %s \n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:561
+#: 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
 msgid "Unmounting CD-ROM\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:583
+#: 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
 msgid "Mounting CD-ROM...\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:609
+#: 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
 msgid "That is not a valid name, try again.\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:726
+#: 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
 msgid "Copying package lists..."
 msgstr ""
 
-#: apt-pkg/cdrom.cc:754
+#: apt-pkg/cdrom.cc:783
 msgid "Writing new source list\n"
 msgstr ""
 
-#: apt-pkg/cdrom.cc:763
+#: 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
 msgid "Unmounting CD-ROM..."
 msgstr ""
 
-#: apt-pkg/indexcopy.cc:261
+#: 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
 #, 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
 #, 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
 #, c-format
 msgid "Wrote %i records with %i missing files and %i mismatched files\n"
 msgstr ""
@@ -2501,6 +2527,10 @@ msgstr ""
 msgid "Removed with config %s"
 msgstr ""
 
+#: methods/rred.cc:219
+msgid "Could not patch file"
+msgstr ""
+
 #: methods/rsh.cc:330
 msgid "Connection closed prematurely"
 msgstr ""