]> git.saurik.com Git - apt.git/commitdiff
* merged with debian-sid branch
authorMichael Vogt <mvo@debian.org>
Wed, 1 Mar 2006 12:36:32 +0000 (12:36 +0000)
committerMichael Vogt <mvo@debian.org>
Wed, 1 Mar 2006 12:36:32 +0000 (12:36 +0000)
Patches applied:

 * bubulle@debian.org--2005/apt--main--0--patch-160
   Italian translation update

 * bubulle@debian.org--2005/apt--main--0--patch-161
   Galician translation completed

 * bubulle@debian.org--2005/apt--main--0--patch-162
   Spanish translation update

 * bubulle@debian.org--2005/apt--main--0--patch-163
   Two strings corrected in the British translation

 * bubulle@debian.org--2005/apt--main--0--patch-164
   Danish translation update

 * bubulle@debian.org--2005/apt--main--0--patch-165
   Completed Greek translation

 * bubulle@debian.org--2005/apt--main--0--patch-166
   Fix some permissions

 * bubulle@debian.org--2005/apt--main--0--patch-167
   Resync with Michael

 * bubulle@debian.org--2005/apt--main--0--patch-168
   Vietnamese translation completed

 * bubulle@debian.org--2005/apt--main--0--patch-169
   Update PO files and POT file...again

 * bubulle@debian.org--2005/apt--main--0--patch-170
   Compelted French translation

 * bubulle@debian.org--2005/apt--main--0--patch-171
   Activate Welsh translation

 * bubulle@debian.org--2005/apt--main--0--patch-172
   Completed to 512 strings

 * bubulle@debian.org--2005/apt--main--0--patch-173
   Russian translation completed

 * bubulle@debian.org--2005/apt--main--0--patch-174
   Swedish translation completed

 * bubulle@debian.org--2005/apt--main--0--patch-175
   Merge from Philippe Batailler French manpages tree/Vietnamese translation update

 * bubulle@debian.org--2005/apt--main--0--patch-176
   Galician translation update

 * bubulle@debian.org--2005/apt--main--0--patch-177
   Slovak translation update

 * bubulle@debian.org--2005/apt--main--0--patch-178
   Polish translation update

 * bubulle@debian.org--2005/apt--main--0--patch-179
   Correct permissions

 * bubulle@debian.org--2005/apt--main--0--patch-180
   Japanese translation update

 * bubulle@debian.org--2005/apt--main--0--patch-181
   Basque translation update

 * bubulle@debian.org--2005/apt--main--0--patch-182
   Catalan translation completed

 * bubulle@debian.org--2005/apt--main--0--patch-183
   Brazilian Portuguese translation update

 * bubulle@debian.org--2005/apt--main--0--patch-184
   Italian translation update

 * bubulle@debian.org--2005/apt--main--0--patch-185
   Japanese manpages translation update

 * bubulle@debian.org--2005/apt--main--0--patch-186
   Simplified Chinese translation update

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-120
   * added debian-archive-keyring to recommends

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-121
   * merged with bubulle

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-122
   * fix apt-key to ask for the correct package

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-123
   * fix typo in apt-cache.8 manpage

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-124
   * fixed another typo in doc/apt-secure.8.xml

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-125
   * merged the debian-sid changes back

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-126
   * fixed the changelog yet again

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-127
   * merged with apt--mvo

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-128
   * don't explod if a Provides has DepCompareOp

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-129
   * fix regression about not working --print-uris in "install"

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-130
   * merged with bubulle

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-131
   * create sources.list.d as well

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-132
   * make apt-cache madion wotk without deb-src lines

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-133
   * only clean out the list dir if the update was successful

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-134
   * only remove the sigfile if pkgAcqMetaSig::Failed() didn't fail for a network error

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-135
   tyop

 * michael.vogt@ubuntu.com--2005/apt--mvo--0--patch-136
   * merged with bubulle

 * mvo@debian.org--2005/apt--debian-sid--0--patch-18
   * merged with apt--mvo

 * mvo@debian.org--2005/apt--debian-sid--0--patch-19
   * synced with mainline

 * mvo@debian.org--2005/apt--debian-sid--0--patch-20
   * merged with mainline, finalized changelog

 * philippe.batailler@free.fr--2005/apt--main--0--patch-9
   manpages

1  2 
apt-pkg/acquire-item.cc
apt-pkg/deb/deblistparser.cc
cmdline/apt-cache.cc
configure.in
debian/changelog

diff --combined apt-pkg/acquire-item.cc
index c6a49653ba617fd40fda5d2f14a5159fd94611be,1fa929aad659823994e4f7286df069095ae90ada..52c516090bc8aed377397434bd5b56a0ec280868
@@@ -24,8 -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>
      
@@@ -33,7 -31,6 +33,7 @@@
  #include <unistd.h>
  #include <errno.h>
  #include <string>
 +#include <sstream>
  #include <stdio.h>
                                                                        /*}}}*/
  
@@@ -134,414 -131,14 +134,414 @@@ void pkgAcquire::Item::Rename(string Fr
  }
                                                                        /*}}}*/
  
 +
 +// 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);
 +
 +   // FIXME: this file:/ check is a hack to prevent fetching
 +   //        from local sources. this is really silly, and
 +   //        should be fixed cleanly as soon as possible
 +   if(!FileExists(CurrentPackagesFile) || 
 +      Desc.URI.substr(0,strlen("file:/")) == "file:/" ||
 +      !_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, local 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 acquire" << 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;
@@@ -711,35 -308,6 +711,35 @@@ void pkgAcqIndex::Done(string Message,u
     Mode = decompProg;
  }
  
 +// AcqIndexTrans::pkgAcqIndexTrans - Constructor                      /*{{{*/
 +// ---------------------------------------------------------------------
 +/* The Translation file is added to the queue */
 +pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner,
 +                          string URI,string URIDesc,string ShortDesc) :
 +                      pkgAcqIndex(Owner, URI, URIDesc, ShortDesc, "", "")
 +{
 +}
 +
 +                                                                      /*}}}*/
 +// AcqIndexTrans::Failed - Silence failure messages for missing files /*{{{*/
 +// ---------------------------------------------------------------------
 +/* */
 +void pkgAcqIndexTrans::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 +{
 +   if (Cnf->LocalOnly == true || 
 +       StringToBool(LookupTag(Message,"Transient-Failure"),false) == false)
 +   {      
 +      // Ignore this
 +      Status = StatDone;
 +      Complete = false;
 +      Dequeue();
 +      return;
 +   }
 +   
 +   Item::Failed(Message,Cnf);
 +}
 +                                                                      /*}}}*/
 +
  pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,
                             string URI,string URIDesc,string ShortDesc,
                             string MetaIndexURI, string MetaIndexURIDesc,
        // File was already in place.  It needs to be re-verified
        // because Release might have changed, so Move it into partial
        Rename(Final,DestFile);
-       // unlink the file and do not try to use I-M-S and Last-Modified
-       // if the users proxy is broken
-       if(_config->FindB("Acquire::BrokenProxy", false) == true) {
-        std::cerr << "forcing re-get of the signature file as requested" << std::endl;
-        unlink(DestFile.c_str());
-       }
     }
  
     QueueURI(Desc);
@@@ -827,18 -389,19 +821,19 @@@ void pkgAcqMetaSig::Done(string Message
                                                                        /*}}}*/
  void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
  {
-    // Delete any existing sigfile, so that this source isn't
-    // mistakenly trusted
-    string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
-    unlink(Final.c_str());
  
-    // if we get a timeout if fail
+    // if we get a network error we fail gracefully
     if(LookupTag(Message,"FailReason") == "Timeout" || 
-       LookupTag(Message,"FailReason") == "TmpResolveFailure") {
+       LookupTag(Message,"FailReason") == "TmpResolveFailure" ||
+       LookupTag(Message,"FailReason") == "ConnectionRefused") {
        Item::Failed(Message,Cnf);
        return;
     }
  
+    // Delete any existing sigfile when the acquire failed
+    string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
+    unlink(Final.c_str());
     // queue a pkgAcqMetaIndex with no sigfile
     new pkgAcqMetaIndex(Owner, MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc,
                       "", IndexTargets, MetaIndexParser);
@@@ -1039,8 -602,8 +1034,8 @@@ void pkgAcqMetaIndex::QueueIndexes(boo
        }
        
        // Queue Packages file
 -      new pkgAcqIndex(Owner, (*Target)->URI, (*Target)->Description,
 -                      (*Target)->ShortDesc, ExpectedIndexMD5);
 +      new pkgAcqDiffIndex(Owner, (*Target)->URI, (*Target)->Description,
 +                        (*Target)->ShortDesc, ExpectedIndexMD5);
     }
  }
  
index 441bb826fa0d59346c957cac91d68c18a001458d,d0dc7a26038df7f222b94361458b3a6ef5a2cb54..c2b26b5eb5322a8f4543a89bea742bf65004ef6c
@@@ -15,7 -15,6 +15,7 @@@
  #include <apt-pkg/configuration.h>
  #include <apt-pkg/strutl.h>
  #include <apt-pkg/crc-16.h>
 +#include <apt-pkg/md5.h>
  
  #include <ctype.h>
  
@@@ -118,48 -117,6 +118,48 @@@ bool debListParser::NewVersion(pkgCache
     return true;
  }
                                                                        /*}}}*/
 +// ListParser::Description - Return the description string            /*{{{*/
 +// ---------------------------------------------------------------------
 +/* This is to return the string describing the package in debian
 +   form. If this returns the blank string then the entry is assumed to
 +   only describe package properties */
 +string debListParser::Description()
 +{
 +   if (DescriptionLanguage().empty())
 +      return Section.FindS("Description");
 +   else
 +      return Section.FindS(("Description-" + pkgIndexFile::LanguageCode()).c_str());
 +}
 +                                                                        /*}}}*/
 +// ListParser::DescriptionLanguage - Return the description lang string       /*{{{*/
 +// ---------------------------------------------------------------------
 +/* This is to return the string describing the language of
 +   description. If this returns the blank string then the entry is
 +   assumed to describe original description. */
 +string debListParser::DescriptionLanguage()
 +{
 +   return Section.FindS("Description").empty() ? pkgIndexFile::LanguageCode() : "";
 +}
 +                                                                        /*}}}*/
 +// ListParser::Description - Return the description_md5 MD5SumValue   /*{{{*/
 +// ---------------------------------------------------------------------
 +/* This is to return the md5 string to allow the check if it is the right
 +   description. If no Description-md5 is found in the section it will be
 +   calculated.
 + */
 +MD5SumValue debListParser::Description_md5()
 +{
 +   string value = Section.FindS("Description-md5");
 +
 +   if (value.empty()) 
 +   {
 +      MD5Summation md5;
 +      md5.Add((Description() + "\n").c_str());
 +      return md5.Result();
 +   } else
 +      return MD5SumValue(value);
 +}
 +                                                                        /*}}}*/
  // ListParser::UsePackage - Update a package structure                        /*{{{*/
  // ---------------------------------------------------------------------
  /* This is called to update the package with any new information 
@@@ -547,11 -504,12 +547,12 @@@ bool debListParser::ParseProvides(pkgCa
        Start = ParseDepends(Start,Stop,Package,Version,Op);
        if (Start == 0)
         return _error->Error("Problem parsing Provides line");
-       if (Op != pkgCache::Dep::NoOp)
-        return _error->Error("Malformed provides line");
-       if (NewProvides(Ver,Package,Version) == false)
-        return false;
+       if (Op != pkgCache::Dep::NoOp) {
+        _error->Warning("Ignoring Provides line with DepCompareOp for package %s", Package.c_str());
+       } else {
+        if (NewProvides(Ver,Package,Version) == false)
+           return false;
+       }
  
        if (Start == Stop)
         break;
diff --combined cmdline/apt-cache.cc
index cb1aeb514f4184ffb55479765bc89e62da27c8c9,aea9ebeba178f18946f656a0f2166610be076664..74fa71cbad37bfa9cec587dd3db18ee438adb29b
@@@ -71,12 -71,6 +71,12 @@@ void LocalitySort(pkgCache::VerFile **b
  {   
     qsort(begin,Count,Size,LocalityCompare);
  }
 +
 +void LocalitySort(pkgCache::DescFile **begin,
 +                unsigned long Count,size_t Size)
 +{   
 +   qsort(begin,Count,Size,LocalityCompare);
 +}
                                                                        /*}}}*/
  // UnMet - Show unmet dependencies                                    /*{{{*/
  // ---------------------------------------------------------------------
@@@ -188,14 -182,7 +188,14 @@@ bool DumpPackage(CommandLine &CmdL
        {
         cout << Cur.VerStr();
         for (pkgCache::VerFileIterator Vf = Cur.FileList(); Vf.end() == false; Vf++)
 -          cout << "(" << Vf.File().FileName() << ")";
 +          cout << " (" << Vf.File().FileName() << ")";
 +       cout << endl;
 +       for (pkgCache::DescIterator D = Cur.DescriptionList(); D.end() == false; D++)
 +       {
 +          cout << " Description Language: " << D.LanguageCode() << endl
 +               << "                 File: " << D.FileList().File().FileName() << endl
 +               << "                  MD5: " << D.md5() << endl;
 +       }
         cout << endl;
        }
        
@@@ -290,15 -277,11 +290,15 @@@ bool Stats(CommandLine &Cmd
     
     cout << _("Total distinct versions: ") << Cache.Head().VersionCount << " (" <<
        SizeToStr(Cache.Head().VersionCount*Cache.Head().VersionSz) << ')' << endl;
 +   cout << _("Total Distinct Descriptions: ") << Cache.Head().DescriptionCount << " (" <<
 +      SizeToStr(Cache.Head().DescriptionCount*Cache.Head().DescriptionSz) << ')' << endl;
     cout << _("Total dependencies: ") << Cache.Head().DependsCount << " (" << 
        SizeToStr(Cache.Head().DependsCount*Cache.Head().DependencySz) << ')' << endl;
     
     cout << _("Total ver/file relations: ") << Cache.Head().VerFileCount << " (" <<
        SizeToStr(Cache.Head().VerFileCount*Cache.Head().VerFileSz) << ')' << endl;
 +   cout << _("Total Desc/File relations: ") << Cache.Head().DescFileCount << " (" <<
 +      SizeToStr(Cache.Head().DescFileCount*Cache.Head().DescFileSz) << ')' << endl;
     cout << _("Total Provides mappings: ") << Cache.Head().ProvidesCount << " (" <<
        SizeToStr(Cache.Head().ProvidesCount*Cache.Head().ProvidesSz) << ')' << endl;
     
@@@ -361,12 -344,6 +361,12 @@@ bool Dump(CommandLine &Cmd
         for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++)
            cout << "  Depends: " << D.TargetPkg().Name() << ' ' << 
                             DeNull(D.TargetVer()) << endl;
 +       for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; D++)
 +       {
 +          cout << " Description Language: " << D.LanguageCode() << endl
 +               << "                 File: " << D.FileList().File().FileName() << endl
 +               << "                  MD5: " << D.md5() << endl;
 +       } 
        }      
     }
  
@@@ -1215,50 -1192,17 +1215,50 @@@ bool DisplayRecord(pkgCache::VerIterato
     if (_error->PendingError() == true)
        return false;
     
 -   // Read the record and then write it out again.
 +   // Read the record
     unsigned char *Buffer = new unsigned char[GCache->HeaderP->MaxVerFileSize+1];
     Buffer[V.FileList()->Size] = '\n';
     if (PkgF.Seek(V.FileList()->Offset) == false ||
 -       PkgF.Read(Buffer,V.FileList()->Size) == false ||
 -       fwrite(Buffer,1,V.FileList()->Size+1,stdout) < (size_t)(V.FileList()->Size+1))
 +       PkgF.Read(Buffer,V.FileList()->Size) == false)
     {
        delete [] Buffer;
        return false;
     }
 -   
 +
 +   // Get a pointer to start of Description field
 +   const unsigned char *DescP = (unsigned char*)strstr((char*)Buffer, "Description:");
 +
 +   // Write all but Description
 +   if (fwrite(Buffer,1,DescP - Buffer,stdout) < (size_t)(DescP - Buffer))
 +   {
 +      delete [] Buffer;
 +      return false;
 +   }
 +
 +   // Show the right description
 +   pkgRecords Recs(*GCache);
 +   pkgCache::DescIterator Desc = V.TranslatedDescription();
 +   pkgRecords::Parser &P = Recs.Lookup(Desc.FileList());
 +   cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc();
 +
 +   // Find the first field after the description (if there is any)
 +   for(DescP++;DescP != &Buffer[V.FileList()->Size];DescP++) 
 +   {
 +      if(*DescP == '\n' && *(DescP+1) != ' ') 
 +      {
 +       // write the rest of the buffer
 +       const unsigned char *end=&Buffer[V.FileList()->Size];
 +       if (fwrite(DescP,1,end-DescP,stdout) < (size_t)(end-DescP)) 
 +       {
 +          delete [] Buffer;
 +          return false;
 +       }
 +
 +       break;
 +      }
 +   }
 +   // write a final newline (after the description)
 +   cout<<endl;
     delete [] Buffer;
  
     return true;
  // Search - Perform a search                                          /*{{{*/
  // ---------------------------------------------------------------------
  /* This searches the package names and pacakge descriptions for a pattern */
 -struct ExVerFile
 +struct ExDescFile
  {
 -   pkgCache::VerFile *Vf;
 +   pkgCache::DescFile *Df;
     bool NameMatch;
  };
  
@@@ -1309,35 -1253,35 +1309,35 @@@ bool Search(CommandLine &CmdL
        return false;
     }
     
 -   ExVerFile *VFList = new ExVerFile[Cache.HeaderP->PackageCount+1];
 -   memset(VFList,0,sizeof(*VFList)*Cache.HeaderP->PackageCount+1);
 +   ExDescFile *DFList = new ExDescFile[Cache.HeaderP->PackageCount+1];
 +   memset(DFList,0,sizeof(*DFList)*Cache.HeaderP->PackageCount+1);
  
     // Map versions that we want to write out onto the VerList array.
     for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
     {
 -      VFList[P->ID].NameMatch = NumPatterns != 0;
 +      DFList[P->ID].NameMatch = NumPatterns != 0;
        for (unsigned I = 0; I != NumPatterns; I++)
        {
         if (regexec(&Patterns[I],P.Name(),0,0,0) == 0)
 -          VFList[P->ID].NameMatch &= true;
 +          DFList[P->ID].NameMatch &= true;
         else
 -          VFList[P->ID].NameMatch = false;
 +          DFList[P->ID].NameMatch = false;
        }
          
        // Doing names only, drop any that dont match..
 -      if (NamesOnly == true && VFList[P->ID].NameMatch == false)
 +      if (NamesOnly == true && DFList[P->ID].NameMatch == false)
         continue;
         
        // Find the proper version to use. 
        pkgCache::VerIterator V = Plcy.GetCandidateVer(P);
        if (V.end() == false)
 -       VFList[P->ID].Vf = V.FileList();
 +       DFList[P->ID].Df = V.DescriptionList().FileList();
     }
        
     // Include all the packages that provide matching names too
     for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
     {
 -      if (VFList[P->ID].NameMatch == false)
 +      if (DFList[P->ID].NameMatch == false)
         continue;
  
        for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; Prv++)
         pkgCache::VerIterator V = Plcy.GetCandidateVer(Prv.OwnerPkg());
         if (V.end() == false)
         {
 -          VFList[Prv.OwnerPkg()->ID].Vf = V.FileList();
 -          VFList[Prv.OwnerPkg()->ID].NameMatch = true;
 +          DFList[Prv.OwnerPkg()->ID].Df = V.DescriptionList().FileList();
 +          DFList[Prv.OwnerPkg()->ID].NameMatch = true;
         }
        }
     }
 -
 -   LocalitySort(&VFList->Vf,Cache.HeaderP->PackageCount,sizeof(*VFList));
 +   
 +   LocalitySort(&DFList->Df,Cache.HeaderP->PackageCount,sizeof(*DFList));
  
     // Iterate over all the version records and check them
 -   for (ExVerFile *J = VFList; J->Vf != 0; J++)
 +   for (ExDescFile *J = DFList; J->Df != 0; J++)
     {
 -      pkgRecords::Parser &P = Recs.Lookup(pkgCache::VerFileIterator(Cache,J->Vf));
 +      pkgRecords::Parser &P = Recs.Lookup(pkgCache::DescFileIterator(Cache,J->Df));
  
        bool Match = true;
        if (J->NameMatch == false)
        }
     }
     
 -   delete [] VFList;
 +   delete [] DFList;
     for (unsigned I = 0; I != NumPatterns; I++)
        regfree(&Patterns[I]);
     if (ferror(stdout))
@@@ -1630,10 -1574,11 +1630,11 @@@ bool Madison(CommandLine &CmdL
  
     pkgCache &Cache = *GCache;
  
-    // Create the text record parsers
+    // Create the src text record parsers and ignore errors about missing
+    // deb-src lines that are generated from pkgSrcRecords::pkgSrcRecords
     pkgSrcRecords SrcRecs(*SrcList);
     if (_error->PendingError() == true)
-       return false;
+       _error->Discard();
  
     for (const char **I = CmdL.FileList + 1; *I != 0; I++)
     {
diff --combined configure.in
index a1913e0fdb37014b77a27c8f6a53da31b9d75215,8d4b99904854414655625841f9cf3816c25bbef1..41609c39dc25728997364f9bdba04cc97e199b38
@@@ -18,7 -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.43.2")
+ AC_DEFINE_UNQUOTED(VERSION,"0.6.43.3")
  PACKAGE="apt"
  AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
  AC_SUBST(PACKAGE)
@@@ -175,21 -175,12 +175,21 @@@ dnl Check for debiando
  AC_PATH_PROG(DEBIANDOC_HTML,debiandoc2html)
  AC_PATH_PROG(DEBIANDOC_TEXT,debiandoc2text)
  
 +dnl Check for doxygen
 +AC_PATH_PROG(DOXYGEN, doxygen)
 +
  dnl Check for the SGML tools needed to build man pages
  AC_PATH_PROG(DOCBOOK2MAN,docbook2man)
  
  dnl Check for the XML tools needed to build man pages
  AC_PATH_PROG(XMLTO,xmlto)
  
 +dnl Check for graphviz
 +AC_CHECK_PROG([HAVE_DOT], [dot], [YES], [NO])
 +AC_PATH_PROG([DOT], [dot], [])
 +DOTDIR=$(dirname $DOT)
 +AC_SUBST(DOTDIR)
 +
  dnl Check for YODL
  dnl AC_CHECK_PROG(YODL_MAN,yodl2man,"yes","")
  
@@@ -209,4 -200,4 +209,4 @@@ f
  AC_SUBST(USE_NLS)
  AC_PATH_PROG(BASH, bash)
  
 -AC_OUTPUT(environment.mak:buildlib/environment.mak.in makefile:buildlib/makefile.in,make -s dirs)
 +AC_OUTPUT(environment.mak:buildlib/environment.mak.in makefile:buildlib/makefile.in doc/Doxyfile,make -s dirs)
diff --combined debian/changelog
index b54cb635f2a944559745109208e152804c300060,64c743a7f32497f50b170baadc57e4f5af6f573d..d2e7802357590e530861dacdb46d7f3a7514c449
@@@ -1,28 -1,57 +1,67 @@@
- apt (0.6.43.2exp1) experimental; urgency=low
++apt (0.6.43.3exp1) 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>  Thu, 12 Jan 2006 23:40:32 +0100
++ -- Michael Vogt <mvo@debian.org>  Wed,  1 Mar 2006 13:34:15 +0100
++
+ apt (0.6.43.3) unstable; urgency=low
+   * Merge bubulle@debian.org--2005/apt--main--0 up to patch-186:
+     * ca.po: Completed to 512t. Closes: #351592
+     * eu.po: Completed to 512t. Closes: #350483
+     * ja.po: Completed to 512t. Closes: #349806
+     * pl.po: Completed to 512t. Closes: #349514
+     * sk.po: Completed to 512t. Closes: #349474
+     * gl.po: Completed to 512 strings Closes: #349407
+     * sv.po: Completed to 512 strings Closes: #349210
+     * ru.po: Completed to 512 strings Closes: #349154
+     * da.po: Completed to 512 strings Closes: #349084
+     * fr.po: Completed to 512 strings
+     * vi.po: Completed to 511 strings  Closes: #348968
+     * zh_CN.po: Completed to 512t. Closes: #353936
+     * it.po: Completed to 512t. Closes: #352803
+     * pt_BR.po: Completed to 512t. Closes: #352419
+     * LINGUAS: Add Welsh
+     * *.po: Updated from sources (512 strings)
+   * apt-pkg/deb/deblistparser.cc:
+     - don't explode on a DepCompareOp in a Provides line, but warn about
+       it and ignore it otherwise (thanks to James Troup for reporting it)
+   * cmdline/apt-get.cc:
+     - don't lock the lists directory in DoInstall, breaks --print-uri 
+       (thanks to James Troup for reporting it)
+   * debian/apt.dirs: create /etc/apt/sources.list.d 
+   * make apt-cache madison work without deb-src entries (#352583)
+   * cmdline/apt-get.cc: only run the list-cleaner if a update was 
+     successfull
+  -- Michael Vogt <mvo@debian.org>  Wed, 22 Feb 2006 10:13:04 +0100
  
  apt (0.6.43.2) unstable; urgency=low
  
-   * Merge bubulle@debian.org--2005/apt--main--0 up to patch-159:
-     - en_GB.po, de.po: fix spaces errors in "Ign " translations
-       Closes: #347258
+   * Merge bubulle@debian.org--2005/apt--main--0 up to patch-166:
+     - en_GB.po, de.po: fix spaces errors in "Ign " translations Closes: #347258
      - makefile: make update-po a pre-requisite of clean target so
-               that POT and PO files are always up-to-date
+               that POT and PO files are always up-to-date
      - sv.po: Completed to 511t. Closes: #346450
      - sk.po: Completed to 511t. Closes: #346369
      - fr.po: Completed to 511t
      - *.po: Updated from sources (511 strings)
+     - el.po: Completed to 511 strings Closes: #344642
+     - da.po: Completed to 511 strings Closes: #348574
+     - es.po: Updated to 510t1f Closes: #348158
+     - gl.po: Completed to 511 strings Closes: #347729
+     - it.po: Yet another update Closes: #347435
+   * added debian-archive-keyring to the Recommends (closes: #347970)
+   * fixed message in apt-key to install debian-archive-keyring 
+   * typos fixed in apt-cache.8 (closes: #348348, #347349)
    * add patch to fix http download corruption problem (thanks to
      Petr Vandrovec, closes: #280844, #290694)
  
-  -- Michael Vogt <michael.vogt@ubuntu.com>  Tue, 10 Jan 2006 17:09:31 +0100
+  -- Michael Vogt <mvo@debian.org>  Thu, 19 Jan 2006 00:06:33 +0100
  
  apt (0.6.43.1) unstable; urgency=low
  
@@@ -139,7 -168,7 +178,7 @@@ apt (0.6.42) unstable; urgency=lo
    * 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
@@@ -224,7 -253,6 +263,7 @@@ apt (0.6.38) unstable; urgency=lo
    
   -- Matt Zimmerman <mdz@debian.org>  Sat, 25 Jun 2005 09:51:00 -0700
  
 +>>>>>>> MERGE-SOURCE
  apt (0.6.37) breezy; urgency=low
  
    * Merge bubulle@debian.org--2005/apt--main--0 up to patch-81