]> git.saurik.com Git - apt.git/commitdiff
merged from http://bzr.debian.org/bzr/apt/apt/debian-sid
authorMichael Vogt <michael.vogt@ubuntu.com>
Fri, 15 Jul 2011 07:53:38 +0000 (09:53 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Fri, 15 Jul 2011 07:53:38 +0000 (09:53 +0200)
1  2 
apt-pkg/acquire-item.cc
apt-pkg/algorithms.cc
apt-pkg/algorithms.h
apt-pkg/depcache.cc
apt-pkg/init.cc
apt-pkg/pkgcachegen.cc
cmdline/apt-get.cc
debian/changelog
debian/rules

diff --combined apt-pkg/acquire-item.cc
index a6698b367d10644795fb283fb877da435b134e67,215615bdddc27ff89642b20a65e2d8316674e614..aa77824f815b186b441d04cebdcf1b435592978d
@@@ -94,7 -94,7 +94,7 @@@ void pkgAcquire::Item::Failed(string Me
  // ---------------------------------------------------------------------
  /* Stash status and the file size. Note that setting Complete means 
     sub-phases of the acquire process such as decompresion are operating */
 -void pkgAcquire::Item::Start(string /*Message*/,unsigned long Size)
 +void pkgAcquire::Item::Start(string /*Message*/,unsigned long long Size)
  {
     Status = StatFetching;
     if (FileSize == 0 && Complete == false)
  // Acquire::Item::Done - Item downloaded OK                           /*{{{*/
  // ---------------------------------------------------------------------
  /* */
 -void pkgAcquire::Item::Done(string Message,unsigned long Size,string Hash,
 +void pkgAcquire::Item::Done(string Message,unsigned long long Size,string Hash,
                            pkgAcquire::MethodConfig *Cnf)
  {
     // We just downloaded something..
@@@ -245,7 -245,7 +245,7 @@@ void pkgAcqSubIndex::Failed(string Mess
     }
  }
                                                                        /*}}}*/
 -void pkgAcqSubIndex::Done(string Message,unsigned long Size,string Md5Hash,   /*{{{*/
 +void pkgAcqSubIndex::Done(string Message,unsigned long long Size,string Md5Hash,      /*{{{*/
                           pkgAcquire::MethodConfig *Cnf)
  {
     if(Debug)
@@@ -544,7 -544,7 +544,7 @@@ void pkgAcqDiffIndex::Failed(string Mes
     Dequeue();
  }
                                                                        /*}}}*/
 -void pkgAcqDiffIndex::Done(string Message,unsigned long Size,string Md5Hash,  /*{{{*/
 +void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,string Md5Hash,     /*{{{*/
                           pkgAcquire::MethodConfig *Cnf)
  {
     if(Debug)
@@@ -710,7 -710,7 +710,7 @@@ bool pkgAcqIndexDiffs::QueueNextDiff(
     return true;
  }
                                                                        /*}}}*/
 -void pkgAcqIndexDiffs::Done(string Message,unsigned long Size,string Md5Hash, /*{{{*/
 +void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Hash,    /*{{{*/
                            pkgAcquire::MethodConfig *Cnf)
  {
     if(Debug)
@@@ -881,7 -881,7 +881,7 @@@ void pkgAcqIndex::Failed(string Message
     to the uncompressed version of the file. If this is so the file
     is copied into the partial directory. In all other cases the file
     is decompressed with a gzip uri. */
 -void pkgAcqIndex::Done(string Message,unsigned long Size,string Hash,
 +void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash,
                       pkgAcquire::MethodConfig *Cfg)
  {
     Item::Done(Message,Size,Hash,Cfg);
@@@ -1123,7 -1123,7 +1123,7 @@@ string pkgAcqMetaSig::Custom600Headers(
     return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
  }
  
 -void pkgAcqMetaSig::Done(string Message,unsigned long Size,string MD5,
 +void pkgAcqMetaSig::Done(string Message,unsigned long long Size,string MD5,
                         pkgAcquire::MethodConfig *Cfg)
  {
     Item::Done(Message,Size,MD5,Cfg);
@@@ -1232,7 -1232,7 +1232,7 @@@ string pkgAcqMetaIndex::Custom600Header
     return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
  }
                                                                        /*}}}*/
 -void pkgAcqMetaIndex::Done(string Message,unsigned long Size,string Hash,     /*{{{*/
 +void pkgAcqMetaIndex::Done(string Message,unsigned long long Size,string Hash,        /*{{{*/
                           pkgAcquire::MethodConfig *Cfg)
  {
     Item::Done(Message,Size,Hash,Cfg);
@@@ -1473,8 -1473,10 +1473,10 @@@ bool pkgAcqMetaIndex::VerifyVendor(stri
         // TRANSLATOR: The first %s is the URL of the bad Release file, the second is
         // the time since then the file is invalid - formated in the same way as in
         // the download progress display (e.g. 7d 3h 42min 1s)
-        return _error->Error(_("Release file expired, ignoring %s (invalid since %s)"),
-                             RealURI.c_str(), TimeToStr(invalid_since).c_str());
+        return _error->Error(
+             _("Release file for %s is expired (invalid since %s). "
+               "Updates for this repository will not be applied."),
+             RealURI.c_str(), TimeToStr(invalid_since).c_str());
     }
  
     if (_config->FindB("Debug::pkgAcquire::Auth", false)) 
@@@ -1730,8 -1732,6 +1732,8 @@@ bool pkgAcqArchive::QueueNext(
        string PkgFile = Parse.FileName();
        if (ForceHash.empty() == false)
        {
 +       if(stringcasecmp(ForceHash, "sha512") == 0)
 +          ExpectedHash = HashString("SHA512", Parse.SHA512Hash());
         if(stringcasecmp(ForceHash, "sha256") == 0)
            ExpectedHash = HashString("SHA256", Parse.SHA256Hash());
         else if (stringcasecmp(ForceHash, "sha1") == 0)
        else
        {
         string Hash;
 -       if ((Hash = Parse.SHA256Hash()).empty() == false)
 +       if ((Hash = Parse.SHA512Hash()).empty() == false)
 +          ExpectedHash = HashString("SHA512", Hash);
 +       else if ((Hash = Parse.SHA256Hash()).empty() == false)
            ExpectedHash = HashString("SHA256", Hash);
         else if ((Hash = Parse.SHA1Hash()).empty() == false)
            ExpectedHash = HashString("SHA1", Hash);
        if (stat(FinalFile.c_str(),&Buf) == 0)
        {
         // Make sure the size matches
 -       if ((unsigned)Buf.st_size == Version->Size)
 +       if ((unsigned long long)Buf.st_size == Version->Size)
         {
            Complete = true;
            Local = true;
        if (stat(FinalFile.c_str(),&Buf) == 0)
        {
         // Make sure the size matches
 -       if ((unsigned)Buf.st_size == Version->Size)
 +       if ((unsigned long long)Buf.st_size == Version->Size)
         {
            Complete = true;
            Local = true;
        if (stat(DestFile.c_str(),&Buf) == 0)
        {
         // Hmm, the partial file is too big, erase it
 -       if ((unsigned)Buf.st_size > Version->Size)
 +       if ((unsigned long long)Buf.st_size > Version->Size)
            unlink(DestFile.c_str());
         else
            PartialSize = Buf.st_size;
  // AcqArchive::Done - Finished fetching                                       /*{{{*/
  // ---------------------------------------------------------------------
  /* */
 -void pkgAcqArchive::Done(string Message,unsigned long Size,string CalcHash,
 +void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash,
                         pkgAcquire::MethodConfig *Cfg)
  {
     Item::Done(Message,Size,CalcHash,Cfg);
@@@ -1941,7 -1939,7 +1943,7 @@@ void pkgAcqArchive::Finished(
  // ---------------------------------------------------------------------
  /* The file is added to the queue */
  pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash,
 -                     unsigned long Size,string Dsc,string ShortDesc,
 +                     unsigned long long Size,string Dsc,string ShortDesc,
                       const string &DestDir, const string &DestFilename,
                         bool IsIndexFile) :
                         Item(Owner), ExpectedHash(Hash), IsIndexFile(IsIndexFile)
     if (stat(DestFile.c_str(),&Buf) == 0)
     {
        // Hmm, the partial file is too big, erase it
 -      if ((unsigned)Buf.st_size > Size)
 +      if ((unsigned long long)Buf.st_size > Size)
         unlink(DestFile.c_str());
        else
         PartialSize = Buf.st_size;
  // AcqFile::Done - Item downloaded OK                                 /*{{{*/
  // ---------------------------------------------------------------------
  /* */
 -void pkgAcqFile::Done(string Message,unsigned long Size,string CalcHash,
 +void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash,
                      pkgAcquire::MethodConfig *Cnf)
  {
     Item::Done(Message,Size,CalcHash,Cnf);
diff --combined apt-pkg/algorithms.cc
index 47bdd4abafaa827138d4d6db1f6f9a679b70bde7,7c911b865cbd4bd7f634ca6ac75831ed89fcb272..8737c5334a50eb3049f28e829eab2afb7f49549c
  #include <apt-pkg/version.h>
  #include <apt-pkg/sptr.h>
  #include <apt-pkg/acquire-item.h>
 -    
 +#include <apt-pkg/edsp.h>
 +
  #include <apti18n.h>
  #include <sys/types.h>
  #include <cstdlib>
  #include <algorithm>
  #include <iostream>
 +
 +#include <stdio.h>
                                                                        /*}}}*/
  using namespace std;
  
@@@ -330,12 -327,6 +330,12 @@@ bool pkgFixBroken(pkgDepCache &Cache
   */
  bool pkgDistUpgrade(pkgDepCache &Cache)
  {
 +   std::string const solver = _config->Find("APT::Solver", "internal");
 +   if (solver != "internal") {
 +      OpTextProgress Prog(*_config);
 +      return EDSP::ResolveExternal(solver.c_str(), Cache, false, true, false, &Prog);
 +   }
 +
     pkgDepCache::ActionGroup group(Cache);
  
     /* Upgrade all installed packages first without autoinst to help the resolver
     to install packages not marked for install */
  bool pkgAllUpgrade(pkgDepCache &Cache)
  {
 +   std::string const solver = _config->Find("APT::Solver", "internal");
 +   if (solver != "internal") {
 +      OpTextProgress Prog(*_config);
 +      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
 +   }
 +
     pkgDepCache::ActionGroup group(Cache);
  
     pkgProblemResolver Fix(&Cache);
@@@ -740,20 -725,7 +740,20 @@@ bool pkgProblemResolver::DoUpgrade(pkgC
     return true;
  }
                                                                        /*}}}*/
 -// ProblemResolver::Resolve - Run the resolution pass                 /*{{{*/
 +// ProblemResolver::Resolve - calls a resolver to fix the situation   /*{{{*/
 +// ---------------------------------------------------------------------
 +/* */
 +bool pkgProblemResolver::Resolve(bool BrokenFix)
 +{
 +   std::string const solver = _config->Find("APT::Solver", "internal");
 +   if (solver != "internal") {
 +      OpTextProgress Prog(*_config);
 +      return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, &Prog);
 +   }
 +   return ResolveInternal(BrokenFix);
 +}
 +                                                                      /*}}}*/
 +// ProblemResolver::ResolveInternal - Run the resolution pass         /*{{{*/
  // ---------------------------------------------------------------------
  /* This routines works by calculating a score for each package. The score
     is derived by considering the package's priority and all reverse 
   
     The BrokenFix flag enables a mode where the algorithm tries to 
     upgrade packages to advoid problems. */
 -bool pkgProblemResolver::Resolve(bool BrokenFix)
 +bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
  {
     pkgDepCache::ActionGroup group(Cache);
  
 -   unsigned long Size = Cache.Head().PackageCount;
 -
     // Record which packages are marked for install
     bool Again = false;
     do
        clog << "Starting" << endl;
     
     MakeScores();
 -   
 +
 +   unsigned long const Size = Cache.Head().PackageCount;
 +
     /* We have to order the packages so that the broken fixing pass 
        operates from highest score to lowest. This prevents problems when
        high score packages cause the removal of lower score packages that
     return true;
  }
                                                                        /*}}}*/
+ // ProblemResolver::BreaksInstOrPolicy - Check if the given pkg is broken/*{{{*/
+ // ---------------------------------------------------------------------
+ /* This checks if the given package is broken either by a hard dependency
+    (InstBroken()) or by introducing a new policy breakage e.g. new
+    unsatisfied recommends for a package that was in "policy-good" state
+    Note that this is not perfect as it will ignore further breakage
+    for already broken policy (recommends)
+ */
+ bool pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator I)
+ {
+    
+    // a broken install is always a problem
+    if (Cache[I].InstBroken() == true)
+       return true;
+    // a newly broken policy (recommends/suggests) is a problem
+    if (Cache[I].NowPolicyBroken() == false &&
+        Cache[I].InstPolicyBroken() == true)
+       return true;
+        
+    return false;
+ }
  // ProblemResolver::ResolveByKeep - Resolve problems using keep               /*{{{*/
  // ---------------------------------------------------------------------
  /* This is the work horse of the soft upgrade routine. It is very gental 
     in that it does not install or remove any packages. It is assumed that the
     system was non-broken previously. */
  bool pkgProblemResolver::ResolveByKeep()
 +{
 +   std::string const solver = _config->Find("APT::Solver", "internal");
 +   if (solver != "internal") {
 +      OpTextProgress Prog(*_config);
 +      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
 +   }
 +   return ResolveByKeepInternal();
 +}
 +                                                                      /*}}}*/
 +// ProblemResolver::ResolveByKeepInternal - Resolve problems using keep       /*{{{*/
 +// ---------------------------------------------------------------------
 +/* This is the work horse of the soft upgrade routine. It is very gental
 +   in that it does not install or remove any packages. It is assumed that the
 +   system was non-broken previously. */
 +bool pkgProblemResolver::ResolveByKeepInternal()
  {
     pkgDepCache::ActionGroup group(Cache);
  
     {
        pkgCache::PkgIterator I(Cache,*K);
  
-       if (Cache[I].InstallVer == 0 || Cache[I].InstBroken() == false)
+       if (Cache[I].InstallVer == 0)
         continue;
  
+       if (InstOrNewPolicyBroken(I) == false)
+          continue;
        /* Keep the package. If this works then great, otherwise we have
                 to be significantly more agressive and manipulate its dependencies */
        if ((Flags[I->ID] & Protected) == 0)
         if (Debug == true)
            clog << "Keeping package " << I.FullName(false) << endl;
         Cache.MarkKeep(I, false, false);
-        if (Cache[I].InstBroken() == false)
+        if (InstOrNewPolicyBroken(I) == false)
         {
            K = PList - 1;
            continue;
                  Cache.MarkKeep(Pkg, false, false);
               }
               
-              if (Cache[I].InstBroken() == false)
+              if (InstOrNewPolicyBroken(I) == false)
                  break;
            }
            
-           if (Cache[I].InstBroken() == false)
+           if (InstOrNewPolicyBroken(I) == false)
               break;
  
            if (Start == End)
            Start++;
         }
              
-        if (Cache[I].InstBroken() == false)
+        if (InstOrNewPolicyBroken(I) == false)
            break;
        }
  
-       if (Cache[I].InstBroken() == true)
+       if (InstOrNewPolicyBroken(I) == true)
         continue;
        
        // Restart again.
diff --combined apt-pkg/algorithms.h
index 050934badcae91779107a61de54ae2c05cda20e9,99501bed1e5dcb945b2b265607069478bc439c12..86d5fbd5309d28439680524258fb0167b52aaf56
@@@ -78,9 -78,6 +78,9 @@@ private
                                                                        /*}}}*/
  class pkgProblemResolver                                              /*{{{*/
  {
 +   /** \brief dpointer placeholder (for later in case we need it) */
 +   void *d;
 +
     pkgDepCache &Cache;
     typedef pkgCache::PkgIterator PkgIterator;
     typedef pkgCache::VerIterator VerIterator;
  
     void MakeScores();
     bool DoUpgrade(pkgCache::PkgIterator Pkg);
 +
 +   bool ResolveInternal(bool const BrokenFix = false);
 +   bool ResolveByKeepInternal();
     
+    protected:
+    bool InstOrNewPolicyBroken(pkgCache::PkgIterator Pkg);
     public:
     
     inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected; Cache.MarkProtected(Pkg);};
diff --combined apt-pkg/depcache.cc
index 1d905df2e202511d8720ff6ef828261b76bc6751,eb3f4e5989f89df99b2126c8f2c2b67cb37bd855..72a0bb542a404467ff48f601254eba94eed837ed
@@@ -406,8 -406,60 +406,8 @@@ bool pkgDepCache::CheckDep(DepIterator 
                                                                        /*}}}*/
  // DepCache::AddSizes - Add the packages sizes to the counters                /*{{{*/
  // ---------------------------------------------------------------------
 -/* Call with Mult = -1 to preform the inverse opration
 -   The Mult increases the complexity of the calulations here and is unused -
 -   or do we really have a usecase for removing the size of a package two
 -   times? So let us replace it with a simple bool and be done with it… */
 -__deprecated void pkgDepCache::AddSizes(const PkgIterator &Pkg,signed long Mult)
 -{
 -   StateCache &P = PkgState[Pkg->ID];
 -   
 -   if (Pkg->VersionList == 0)
 -      return;
 -   
 -   if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure && 
 -       P.Keep() == true)
 -      return;
 -   
 -   // Compute the size data
 -   if (P.NewInstall() == true)
 -   {
 -      iUsrSize += (signed long long)(Mult*P.InstVerIter(*this)->InstalledSize);
 -      iDownloadSize += (signed long long)(Mult*P.InstVerIter(*this)->Size);
 -      return;
 -   }
 -   
 -   // Upgrading
 -   if (Pkg->CurrentVer != 0 && 
 -       (P.InstallVer != (Version *)Pkg.CurrentVer() || 
 -      (P.iFlags & ReInstall) == ReInstall) && P.InstallVer != 0)
 -   {
 -      iUsrSize += (signed long long)(Mult*((signed long long)P.InstVerIter(*this)->InstalledSize - 
 -                      (signed long long)Pkg.CurrentVer()->InstalledSize));
 -      iDownloadSize += (signed long long)(Mult*P.InstVerIter(*this)->Size);
 -      return;
 -   }
 -   
 -   // Reinstall
 -   if (Pkg.State() == pkgCache::PkgIterator::NeedsUnpack &&
 -       P.Delete() == false)
 -   {
 -      iDownloadSize += (signed long long)(Mult*P.InstVerIter(*this)->Size);
 -      return;
 -   }
 -   
 -   // Removing
 -   if (Pkg->CurrentVer != 0 && P.InstallVer == 0)
 -   {
 -      iUsrSize -= (signed long long)(Mult*Pkg.CurrentVer()->InstalledSize);
 -      return;
 -   }   
 -}
 -                                                                      /*}}}*/
 -// DepCache::AddSizes - Add the packages sizes to the counters                /*{{{*/
 -// ---------------------------------------------------------------------
  /* Call with Inverse = true to preform the inverse opration */
 -void pkgDepCache::AddSizes(const PkgIterator &Pkg, bool const &Inverse)
 +void pkgDepCache::AddSizes(const PkgIterator &Pkg, bool const Inverse)
  {
     StateCache &P = PkgState[Pkg->ID];
     
     calld Remove/Add itself. Remember, dependencies can be circular so
     while processing a dep for Pkg it is possible that Add/Remove
     will be called on Pkg */
 -void pkgDepCache::AddStates(const PkgIterator &Pkg,int Add)
 +void pkgDepCache::AddStates(const PkgIterator &Pkg, bool const Invert)
  {
 +   signed char const Add = (Invert == false) ? 1 : -1;
     StateCache &State = PkgState[Pkg->ID];
     
     // The Package is broken (either minimal dep or policy dep)
@@@ -755,17 -806,17 +755,17 @@@ void pkgDepCache::Update(PkgIterator co
  // DepCache::MarkKeep - Put the package in the keep state             /*{{{*/
  // ---------------------------------------------------------------------
  /* */
 -void pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser,
 +bool pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser,
                             unsigned long Depth)
  {
     if (IsModeChangeOk(ModeKeep, Pkg, Depth, FromUser) == false)
 -      return;
 +      return false;
  
     /* Reject an attempt to keep a non-source broken installed package, those
        must be upgraded */
     if (Pkg.State() == PkgIterator::NeedsUnpack && 
         Pkg.CurrentVer().Downloadable() == false)
 -      return;
 +      return false;
  
     /* We changed the soft state all the time so the UI is a bit nicer
        to use */
  
     // Check that it is not already kept
     if (P.Mode == ModeKeep)
 -      return;
 +      return true;
  
     if (Soft == true)
        P.iFlags |= AutoKept;
        P.InstallVer = Pkg.CurrentVer();
  
     AddStates(Pkg);
 -
     Update(Pkg);
 -
     AddSizes(Pkg);
 +
 +   return true;
  }
                                                                        /*}}}*/
  // DepCache::MarkDelete - Put the package in the delete state         /*{{{*/
  // ---------------------------------------------------------------------
  /* */
 -void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge,
 +bool pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge,
                               unsigned long Depth, bool FromUser)
  {
     if (IsModeChangeOk(ModeDelete, Pkg, Depth, FromUser) == false)
 -      return;
 +      return false;
  
     StateCache &P = PkgState[Pkg->ID];
  
     // Check that it is not already marked for delete
     if ((P.Mode == ModeDelete || P.InstallVer == 0) && 
         (Pkg.Purge() == true || rPurge == false))
 -      return;
 +      return true;
  
     // check if we are allowed to remove the package
     if (IsDeleteOk(Pkg,rPurge,Depth,FromUser) == false)
 -      return;
 +      return false;
  
     P.iFlags &= ~(AutoKept | Purge);
     if (rPurge == true)
     Update(Pkg);
     AddSizes(Pkg);
  
 +   return true;
  }
                                                                        /*}}}*/
  // DepCache::IsDeleteOk - check if it is ok to remove this package    /*{{{*/
@@@ -935,18 -985,18 +935,18 @@@ bool pkgDepCache::IsModeChangeOk(ModeLi
  // DepCache::MarkInstall - Put the package in the install state               /*{{{*/
  // ---------------------------------------------------------------------
  /* */
 -void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
 +bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
                              unsigned long Depth, bool FromUser,
                              bool ForceImportantDeps)
  {
     if (IsModeChangeOk(ModeInstall, Pkg, Depth, FromUser) == false)
 -      return;
 +      return false;
  
     StateCache &P = PkgState[Pkg->ID];
  
     // See if there is even any possible instalation candidate
     if (P.CandidateVer == 0)
 -      return;
 +      return false;
  
     /* Check that it is not already marked for install and that it can be 
        installed */
        P.CandidateVer == (Version *)Pkg.CurrentVer()))
     {
        if (P.CandidateVer == (Version *)Pkg.CurrentVer() && P.InstallVer == 0)
 -       MarkKeep(Pkg, false, FromUser, Depth+1);
 -      return;
 +       return MarkKeep(Pkg, false, FromUser, Depth+1);
 +      return true;
     }
  
     // check if we are allowed to install the package
     if (IsInstallOk(Pkg,AutoInst,Depth,FromUser) == false)
 -      return;
 +      return false;
  
     ActionGroup group(*this);
     P.iFlags &= ~AutoKept;
     Update(Pkg);
     AddSizes(Pkg);
  
 -   if (AutoInst == false)
 -      return;
 +   if (AutoInst == false || _config->Find("APT::Solver", "internal") != "internal")
 +      return true;
  
     if (DebugMarker == true)
        std::clog << OutputInDepth(Depth) << "MarkInstall " << Pkg << " FU=" << FromUser << std::endl;
            continue;
         // if the dependency was critical, we can't install it, so remove it again
         MarkDelete(Pkg,false,Depth + 1, false);
 -       return;
 +       return false;
        }
  
        /* Check if any ImportantDep() (but not Critical) were added
               continue;
  
            if (PkgState[Pkg->ID].CandidateVer != *I &&
 -              Start->Type == Dep::DpkgBreaks)
 -             MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps);
 -          else
 -             MarkDelete(Pkg,false,Depth + 1, false);
 +              Start->Type == Dep::DpkgBreaks &&
 +              MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps) == true)
 +             continue;
 +          else if (MarkDelete(Pkg,false,Depth + 1, false) == false)
 +             break;
         }
         continue;
        }      
     }
 +
 +   return Dep.end() == true;
  }
                                                                        /*}}}*/
  // DepCache::IsInstallOk - check if it is ok to install this package  /*{{{*/
@@@ -1221,7 -1268,7 +1221,7 @@@ void pkgDepCache::SetReInstall(PkgItera
  // DepCache::SetCandidateVersion - Change the candidate version               /*{{{*/
  // ---------------------------------------------------------------------
  /* */
 -void pkgDepCache::SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo)
 +void pkgDepCache::SetCandidateVersion(VerIterator TargetVer)
  {
     pkgCache::PkgIterator Pkg = TargetVer.ParentPkg();
     StateCache &P = PkgState[Pkg->ID];
@@@ -1527,12 -1574,6 +1527,12 @@@ bool pkgDepCache::Policy::IsImportantDe
     return false;
  }
                                                                        /*}}}*/
 +// Policy::GetPriority - Get the priority of the package pin          /*{{{*/
 +signed short pkgDepCache::Policy::GetPriority(pkgCache::PkgIterator const &Pkg)
 +{ return 0; };
 +signed short pkgDepCache::Policy::GetPriority(pkgCache::PkgFileIterator const &File)
 +{ return 0; };
 +                                                                      /*}}}*/
  pkgDepCache::InRootSetFunc *pkgDepCache::GetRootSetFunc()             /*{{{*/
  {
    DefaultRootSetFunc *f = new DefaultRootSetFunc;
@@@ -1552,15 -1593,12 +1552,15 @@@ bool pkgDepCache::MarkFollowsRecommends
  
  bool pkgDepCache::MarkFollowsSuggests()
  {
-   return _config->FindB("APT::AutoRemove::SuggestsImportant", false);
+   return _config->FindB("APT::AutoRemove::SuggestsImportant", true);
  }
  
  // pkgDepCache::MarkRequired - the main mark algorithm                        /*{{{*/
  bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc)
  {
 +   if (_config->Find("APT::Solver", "internal") != "internal")
 +      return true;
 +
     bool follow_recommends;
     bool follow_suggests;
     bool debug_autoremove = _config->FindB("Debug::pkgAutoRemove",false);
diff --combined apt-pkg/init.cc
index 66b0119e605270df61466fe2e879b308eff47003,38a0814e54ed52f0879c50ae79748b2f2610c546..8f20c31df172b28e69ae89ec4139228453fe991f
@@@ -33,62 -33,64 +33,65 @@@ const char *pkgLibVersion = Stringfy(AP
  bool pkgInitConfig(Configuration &Cnf)
  {
     // General APT things
-    Cnf.Set("APT::Architecture", COMMON_ARCH);
-    Cnf.Set("APT::Build-Essential::", "build-essential");
-    Cnf.Set("APT::Install-Recommends", true);
-    Cnf.Set("APT::Install-Suggests", false);
-    Cnf.Set("Dir","/");
+    Cnf.CndSet("APT::Architecture", COMMON_ARCH);
+    if (Cnf.Exists("APT::Build-Essential") == false)
+       Cnf.Set("APT::Build-Essential::", "build-essential");
+    Cnf.CndSet("APT::Install-Recommends", true);
+    Cnf.CndSet("APT::Install-Suggests", false);
+    Cnf.CndSet("Dir","/");
     
     // State   
-    Cnf.Set("Dir::State","var/lib/apt/");
+    Cnf.CndSet("Dir::State","var/lib/apt/");
     
     /* Just in case something goes horribly wrong, we can fall back to the
        old /var/state paths.. */
     struct stat St;   
     if (stat("/var/lib/apt/.",&St) != 0 &&
         stat("/var/state/apt/.",&St) == 0)
-       Cnf.Set("Dir::State","var/state/apt/");
+       Cnf.CndSet("Dir::State","var/state/apt/");
         
-    Cnf.Set("Dir::State::lists","lists/");
-    Cnf.Set("Dir::State::cdroms","cdroms.list");
-    Cnf.Set("Dir::State::mirrors","mirrors/");
+    Cnf.CndSet("Dir::State::lists","lists/");
+    Cnf.CndSet("Dir::State::cdroms","cdroms.list");
+    Cnf.CndSet("Dir::State::mirrors","mirrors/");
  
     // Cache
-    Cnf.Set("Dir::Cache","var/cache/apt/");
-    Cnf.Set("Dir::Cache::archives","archives/");
-    Cnf.Set("Dir::Cache::srcpkgcache","srcpkgcache.bin");
-    Cnf.Set("Dir::Cache::pkgcache","pkgcache.bin");
+    Cnf.CndSet("Dir::Cache","var/cache/apt/");
+    Cnf.CndSet("Dir::Cache::archives","archives/");
+    Cnf.CndSet("Dir::Cache::srcpkgcache","srcpkgcache.bin");
+    Cnf.CndSet("Dir::Cache::pkgcache","pkgcache.bin");
     
     // Configuration
-    Cnf.Set("Dir::Etc","etc/apt/");
-    Cnf.Set("Dir::Etc::sourcelist","sources.list");
-    Cnf.Set("Dir::Etc::sourceparts","sources.list.d");
-    Cnf.Set("Dir::Etc::vendorlist","vendors.list");
-    Cnf.Set("Dir::Etc::vendorparts","vendors.list.d");
-    Cnf.Set("Dir::Etc::main","apt.conf");
-    Cnf.Set("Dir::Etc::netrc", "auth.conf");
-    Cnf.Set("Dir::Etc::parts","apt.conf.d");
-    Cnf.Set("Dir::Etc::preferences","preferences");
-    Cnf.Set("Dir::Etc::preferencesparts","preferences.d");
-    Cnf.Set("Dir::Etc::trusted", "trusted.gpg");
-    Cnf.Set("Dir::Etc::trustedparts","trusted.gpg.d");
-    Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods");
-    Cnf.Set("Dir::Bin::solvers::","/usr/lib/apt/solvers");
-    Cnf.Set("Dir::Media::MountPath","/media/apt");
+    Cnf.CndSet("Dir::Etc","etc/apt/");
+    Cnf.CndSet("Dir::Etc::sourcelist","sources.list");
+    Cnf.CndSet("Dir::Etc::sourceparts","sources.list.d");
+    Cnf.CndSet("Dir::Etc::vendorlist","vendors.list");
+    Cnf.CndSet("Dir::Etc::vendorparts","vendors.list.d");
+    Cnf.CndSet("Dir::Etc::main","apt.conf");
+    Cnf.CndSet("Dir::Etc::netrc", "auth.conf");
+    Cnf.CndSet("Dir::Etc::parts","apt.conf.d");
+    Cnf.CndSet("Dir::Etc::preferences","preferences");
+    Cnf.CndSet("Dir::Etc::preferencesparts","preferences.d");
+    Cnf.CndSet("Dir::Etc::trusted", "trusted.gpg");
+    Cnf.CndSet("Dir::Etc::trustedparts","trusted.gpg.d");
+    Cnf.CndSet("Dir::Bin::methods","/usr/lib/apt/methods");
++   Cnf.CndSet("Dir::Bin::solvers::","/usr/lib/apt/solvers");
+    Cnf.CndSet("Dir::Media::MountPath","/media/apt");
  
     // State   
-    Cnf.Set("Dir::Log","var/log/apt");
-    Cnf.Set("Dir::Log::Terminal","term.log");
-    Cnf.Set("Dir::Log::History","history.log");
+    Cnf.CndSet("Dir::Log","var/log/apt");
+    Cnf.CndSet("Dir::Log::Terminal","term.log");
+    Cnf.CndSet("Dir::Log::History","history.log");
  
-    Cnf.Set("Dir::Ignore-Files-Silently::", "~$");
-    Cnf.Set("Dir::Ignore-Files-Silently::", "\\.disabled$");
-    Cnf.Set("Dir::Ignore-Files-Silently::", "\\.bak$");
-    Cnf.Set("Dir::Ignore-Files-Silently::", "\\.dpkg-[a-z]+$");
+    if (Cnf.Exists("Dir::Ignore-Files-Silently") == false)
+    {
+       Cnf.Set("Dir::Ignore-Files-Silently::", "~$");
+       Cnf.Set("Dir::Ignore-Files-Silently::", "\\.disabled$");
+       Cnf.Set("Dir::Ignore-Files-Silently::", "\\.bak$");
+       Cnf.Set("Dir::Ignore-Files-Silently::", "\\.dpkg-[a-z]+$");
+    }
  
     // Default cdrom mount point
-    Cnf.Set("Acquire::cdrom::mount", "/media/cdrom/");
+    Cnf.CndSet("Acquire::cdrom::mount", "/media/cdrom/");
  
     bool Res = true;
     
diff --combined apt-pkg/pkgcachegen.cc
index 8e088ba68d1baaa037528bcb333e267d4722d824,8f9737e265e9de696b225cd7f6867e47e177d775..b89c8c0d392588d86d92b841c1aece8a52713cfc
@@@ -642,7 -642,7 +642,7 @@@ bool pkgCacheGenerator::FinishCache(OpP
               bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
               for (vector<string>::const_iterator A = archs.begin(); A != archs.end(); ++A)
               {
 -                if (*A == Arch)
 +                if (Arch == 0 || *A == Arch)
                     continue;
                  /* We allow only one installed arch at the time
                     per group, therefore each group member conflicts
@@@ -1169,16 -1169,32 +1169,32 @@@ bool pkgCacheGenerator::MakeStatusCache
     SPtr<DynamicMMap> Map;
     if (Writeable == true && CacheFile.empty() == false)
     {
+       _error->PushToStack();
        unlink(CacheFile.c_str());
        CacheF = new FileFd(CacheFile,FileFd::WriteAtomic);
        fchmod(CacheF->Fd(),0644);
        Map = CreateDynamicMMap(CacheF, MMap::Public);
        if (_error->PendingError() == true)
-        return false;
-       if (Debug == true)
+       {
+        delete CacheF.UnGuard();
+        delete Map.UnGuard();
+        if (Debug == true)
+           std::clog << "Open filebased MMap FAILED" << std::endl;
+        Writeable = false;
+        if (AllowMem == false)
+        {
+           _error->MergeWithStack();
+           return false;
+        }
+        _error->RevertToStack();
+       }
+       else if (Debug == true)
+       {
+        _error->MergeWithStack();
         std::clog << "Open filebased MMap" << std::endl;
+       }
     }
-    else
+    if (Writeable == false || CacheFile.empty() == true)
     {
        // Just build it in memory..
        Map = CreateDynamicMMap(NULL);
diff --combined cmdline/apt-get.cc
index 94e078cb3a912baf02547606d6e05e2a91363adb,3292ae745ac4255688583ed2aec99ec5c3b4f146..1a03acaa8c18b68671d5ad3a72f69f59f4bcbf9e
@@@ -135,11 -135,6 +135,11 @@@ bool YnPrompt(bool Default=true
        c1out << _("Y") << endl;
        return true;
     }
 +   else if (_config->FindB("APT::Get::Assume-No",false) == true)
 +   {
 +      c1out << _("N") << endl;
 +      return false;
 +   }
  
     char response[1024] = "";
     cin.getline(response, sizeof(response));
@@@ -1702,7 -1697,7 +1702,7 @@@ bool DoAutomaticRemove(CacheFile &Cache
  
     // we could have removed a new dependency of a garbage package,
     // so check if a reverse depends is broken and if so install it again.
-    if (tooMuch.empty() == false && Cache->BrokenCount() != 0)
+    if (tooMuch.empty() == false && (Cache->BrokenCount() != 0 || Cache->PolicyBrokenCount() != 0))
     {
        bool Changed;
        do {
            for (pkgCache::DepIterator R = P.RevDependsList();
                 R.end() == false; ++R)
            {
-              if (R->Type != pkgCache::Dep::Depends &&
-                  R->Type != pkgCache::Dep::PreDepends)
+              if (R.IsNegative() == true ||
+                  Cache->IsImportantDep(R) == false)
                  continue;
               pkgCache::PkgIterator N = R.ParentPkg();
               if (N.end() == true || (N->CurrentVer == 0 && (*Cache)[N].Install() == false))
@@@ -1891,7 -1886,8 +1891,7 @@@ bool DoInstall(CommandLine &CmdL
        {
         // Call the scored problem resolver
         Fix->InstallProtect();
 -       if (Fix->Resolve(true) == false)
 -          _error->Discard();
 +       Fix->Resolve(true);
         delete Fix;
        }
  
         c1out << _("The following information may help to resolve the situation:") << endl;
         c1out << endl;
         ShowBroken(c1out,Cache,false);
 -       return _error->Error(_("Broken packages"));
 -      }   
 +       if (_error->PendingError() == true)
 +          return false;
 +       else
 +          return _error->Error(_("Broken packages"));
 +      }
     }
     if (!DoAutomaticRemove(Cache)) 
        return false;
@@@ -2304,8 -2297,6 +2304,8 @@@ bool DoDownload(CommandLine &CmdL
        strprintf(descr, _("Downloading %s %s"), Pkg.Name(), Ver.VerStr());
        // get the most appropriate hash
        HashString hash;
 +      if (rec.SHA512Hash() != "")
 +         hash = HashString("sha512", rec.SHA512Hash());
        if (rec.SHA256Hash() != "")
           hash = HashString("sha256", rec.SHA256Hash());
        else if (rec.SHA1Hash() != "")
@@@ -3250,8 -3241,7 +3250,8 @@@ int main(int argc,const char *argv[]
        {'s',"dry-run","APT::Get::Simulate",0},
        {'s',"no-act","APT::Get::Simulate",0},
        {'y',"yes","APT::Get::Assume-Yes",0},
 -      {'y',"assume-yes","APT::Get::Assume-Yes",0},      
 +      {'y',"assume-yes","APT::Get::Assume-Yes",0},
 +      {0,"assume-no","APT::Get::Assume-No",0},
        {'f',"fix-broken","APT::Get::Fix-Broken",0},
        {'u',"show-upgraded","APT::Get::Show-Upgraded",0},
        {'m',"ignore-missing","APT::Get::Fix-Missing",0},
        {0,"install-recommends","APT::Install-Recommends",CommandLine::Boolean},
        {0,"install-suggests","APT::Install-Suggests",CommandLine::Boolean},
        {0,"fix-policy","APT::Get::Fix-Policy-Broken",0},
 +      {0,"solver","APT::Solver",CommandLine::HasArg},
        {'c',"config-file",0,CommandLine::ConfigFile},
        {'o',"option",0,CommandLine::ArbItem},
        {0,0,0,0}};
diff --combined debian/changelog
index d226d91c4a68f877a01d24e8e98abde28686cd46,2e22e64d8611a76375fdfe6bbfc04d9359e54404..4d7f06fea469e1c53d70d47f304577c53cb020b5
@@@ -1,68 -1,11 +1,75 @@@
- apt (0.8.15.2) unstable; urgency=low
 +apt (0.8.16~exp3) UNRELEASEDexperimental; urgency=low
 +
 +  [ David Kalnischkies ]
 +  * apt-pkg/pkgcache.h:
 +    - readd All{Foreign,Allowed} as suggested by Julian to
 +      remain strictly API compatible
 +  * apt-pkg/acquire*.{cc,h}:
 +    - try even harder to support really big files in the fetcher by
 +      converting (hopefully) everything to 'long long' (Closes: #632271)
 +  * ftparchive/writer.cc:
 +    - generate all checksums in one run over the file for Release
 +  * cmdline/apt-get.cc:
 +    - add an --assume-no option for testing to say 'no' to everything
 +  * apt-pkg/deb/debmetaindex.cc:
 +    - add trusted=yes option to mark unsigned (local) repository as trusted
 +      based on a patch from Ansgar Burchardt, thanks a lot! (Closes: #596498)
 +
 +  [ Michael Vogt ]
 +  * merge fixes from the debian/unstable upload
 +  * merge lp:~mvo/apt/sha512-template to get fixes for the 
 +    sha1/md5 verifiation (closes: #632520)
 +
 + -- David Kalnischkies <kalnischkies@gmail.com>  Thu, 14 Jul 2011 20:56:45 +0200
 +
 +apt (0.8.16~exp2) experimental; urgency=low
 +
 +  [ David Kalnischkies ]
 +  * [ABI-Break] Implement EDSP in libapt-pkg so that all front-ends which
 +    use the internal resolver can now be used also with external
 +    ones as the usage is hidden in between the old API
 +  * provide two edsp solvers in apt-utils:
 +    - 'dump' to quickly output a complete scenario and
 +    - 'apt' to use the internal as an external resolver
 +  * apt-pkg/pkgcache.h:
 +    - clean up mess with the "all" handling in MultiArch to
 +      fix LP: #733741 cleanly for everyone now
 +  * apt-pkg/depcache.cc:
 +    - use a boolean instead of an int for Add/Remove in AddStates
 +      similar to how it works with AddSizes
 +    - let the Mark methods return if their marking was successful
 +    - if a Breaks can't be upgraded, remove it. If it or a Conflict
 +      can't be removed the installation of the breaker fails.
 +  * cmdline/apt-get.cc:
 +    - do not discard the error messages from the resolver and instead
 +      only show the general 'Broken packages' message if nothing else
 +
 +  [ Stefano Zacchiroli ]
 +  * doc/external-dependency-solver-protocol.txt:
 +    - describe EDSP and the configuration interface around it
 +  
 +  [ Michael Vogt ]
 +  * [ABI-Break] merge lp:~mvo/apt/sha512-template to add support for sha512
 +  * [ABI-Break] merge lp:~mvo/apt/dpointer to support easier extending
 +    without breaking the ABI
 +  * increase ABI version and update package names
 +
 + -- Michael Vogt <mvo@debian.org>  Wed, 29 Jun 2011 13:57:28 +0200
 +
 +apt (0.8.16~exp1) experimental; urgency=low
 +
 +  * merged with the debian/unstable upload
 +
 + -- Michael Vogt <mvo@debian.org>  Wed, 29 Jun 2011 12:40:31 +0200
 +
+ apt (0.8.15.3) UNRELEASED; urgency=low
+   [ Michael Vogt ]
+   * apt-pkg/acquire-item.cc:
+     - improve error message for a expired Release file
+   * apt-pkg/algorithms.cc:
+     - Hold back packages that would enter "policy-broken" state on upgrade
+       when doing a "apt-get upgrade"
  
    [ David Kalnischkies ]
    * apt-pkg/pkgcachegen.cc:
        told us the opposite before (e.g. in fakeroot 1.16) (Closes: #630591)
    * doc/sources.list.5.xml:
      - document available [options] for sources.list entries (Closes: 632441)
+   * doc/apt.conf.5.xml:
+     - document APT::Architectures list (Closes: #612102)
+   * cmdline/apt-get.cc:
+     - restore all important dependencies for garbage packages (LP: #806274)
+   * apt-pkg/init.cc:
+     - use CndSet in pkgInitConfig (Closes: #629617)
+   * apt-pkg/depcache.cc:
+     - change default of APT::AutoRemove::SuggestsImportant to true
+  -- David Kalnischkies <kalnischkies@gmail.com>  Fri, 15 Jul 2011 09:29:37 +0200
+ apt (0.8.15.2) unstable; urgency=high
+   * fix from David Kalnischkies for the InRelease gpg verification 
+     code (LP: #784473)
  
-  -- David Kalnischkies <kalnischkies@gmail.com>  Tue, 05 Jul 2011 15:12:21 +0200
+  -- Michael Vogt <mvo@debian.org>  Tue, 12 Jul 2011 11:54:47 +0200
  
  apt (0.8.15.1) unstable; urgency=low
  
@@@ -205,185 -163,6 +227,185 @@@ apt (0.8.15) unstable; urgency=lo
  
   -- Michael Vogt <mvo@debian.org>  Tue, 28 Jun 2011 18:00:48 +0200
  
 +apt (0.8.15~exp3) experimental; urgency=low
 +
 +  * debian/control:
 +    - add Breaks: 0.8.15~exp3) for libapt-pkg4.10 and 
 +     libapt-inst1.2 (thanks to Jonathan Nieder, closes: #630214)
 +    - use depends for the ${shlibs:Depends} to make the breaks work
 +
 + -- Michael Vogt <mvo@debian.org>  Fri, 17 Jun 2011 21:51:41 +0200
 +
 +apt (0.8.15~exp2) experimental; urgency=low
 +
 +  * debian/control:
 +    - fix incorrect Replaces (closes: #630204) for libapt-inst1.2
 +
 + -- Michael Vogt <mvo@debian.org>  Wed, 15 Jun 2011 16:51:14 +0200
 +
 +apt (0.8.15~exp1) experimental; urgency=low
 +
 +  [ Julian Andres Klode ]
 +  * apt-pkg/depcache.cc:
 +    - Really release action groups only once (Closes: #622744)
 +    - Make purge work again for config-files (LP: #244598) (Closes: #150831)
 +  * apt-pkg/acquire-item.cc:
 +    - Reject files known to be invalid (LP: #346386) (Closes: #627642)
 +  * debian/apt.cron.daily:
 +    - Check power after wait, patch by manuel-soto (LP: #705269)
 +  * debian/control:
 +    - Move ${shlibs:Depends} to Pre-Depends, as we do not want APT
 +      unpacked if a library is too old and thus break upgrades
 +  * doc/apt-key.8.xml:
 +    - Document apt-key net-update (LP: #192810)
 +
 +  [ Christian Perrier ]
 +  * Galician translation update (Miguel Anxo Bouzada). Closes: #626505
 +  * Italian translation update (Milo Casagrande). Closes: #627834
 +  * German documentation translation update (Chris Leick). Closes: #629949
 +
 +  [ David Kalnischkies ]
 +  * fix a bunch of cppcheck warnings/errors based on a patch by
 +    Niels Thykier, thanks! (Closes: #622805)
 +  * apt-pkg/depcache.cc:
 +    - really include 'rc' packages in the delete count by fixing a
 +      typo which exists since 1999 in the source… (LP: #761175)
 +    - if critical or-group can't be satisfied, exit directly.
 +  * apt-pkg/acquire-method.cc:
 +    - write directly to stdout instead of creating the message in
 +      memory first before writing to avoid hitting limits
 +    - fix order of CurrentURI and UsedMirror in Status() and Log()
 +  * apt-pkg/orderlist.cc:
 +    - let VisitRProvides report if the calls were successful
 +  * apt-pkg/deb/dpkgpm.cc:
 +    - replace obsolete usleep with nanosleep
 +  * debian/apt{,-utils}.symbols:
 +    - update both experimental symbol-files to reflect 0.8.14 state
 +  * debian/rules:
 +    - remove unused embedded jquery by doxygen from libapt-pkg-doc
 +  * cmdline/apt-mark.cc:
 +    - reimplement apt-mark in c++
 +    - provide a 'showmanual' command (Closes: #582791)
 +    - provide a 'dpkg --set-selections' wrapper to set/release holds
 +  * cmdline/apt-get.cc:
 +    - deprecate mostly undocumented 'markauto' in favor of 'apt-mark'
 +  * cmdline/apt-cache.cc:
 +    - deprecate mostly undocumented 'showauto' in favor of 'apt-mark'
 +  * apt-pkg/pkgcache.cc:
 +    - really ignore :arch in FindPkg() in non-multiarch environment
 +  * doc/po/de.po:
 +    - undo the translation of the command 'dump' in manpage of apt-config
 +      as report by Burghard Grossmann on debian-l10n-german, thanks!
 +  * apt-pkg/deb/debmetaindex.cc:
 +    - do not download TranslationIndex if no Translation-* will be
 +      downloaded later on anyway (Closes: #624218)
 +  * test/versions.lst:
 +    - disable obscure version number tests with versions dpkg doesn't
 +      allow any more as they don't start with a number
 +  * apt-pkg/acquire-worker.cc:
 +    - print filename in the unmatching size warning (Closes: #623137)
 +  * apt-pkg/acquire-item.cc:
 +    - apply fix for poorly worded 'locate file' error message from
 +      Ben Finney, thanks! (Closes: #623171)
 +  * methods/http.cc:
 +    - add config option to ignore a closed stdin to be able to easily
 +      use the method as a simple standalone downloader
 +    - Location header in redirects should be absolute URI, but some
 +      servers just send an absolute path so still deal with it properly
 +    - dequote URL taken from Location in redirects as we will otherwise
 +      quote an already quoted string in the request later (Closes: #602412)
 +  * apt-pkg/contrib/netrc.cc:
 +    - replace non-posix gnu-extension strdupa with strdup
 +  * apt-pkg/packagemanager.cc:
 +    - ensure for Multi-Arch:same packages that they are unpacked in
 +      lock step even in immediate configuration (Closes: #618288)
 +
 +  [ Michael Vogt ]
 +  * methods/mirror.cc:
 +    - ignore lines starting with "#" in the mirror file
 +    - ignore non http urls in the mirrors
 +    - append the dist (e.g. sid, wheezy) as a query string when
 +      asking for a suitable mirror 
 +  * debian/control:
 +    - add libapt-pkg4.10 and libapt-inst1.2 library packages
 +
 + -- Michael Vogt <mvo@debian.org>  Fri, 10 Jun 2011 15:32:07 +0200
 +
 +apt (0.8.14.2) UNRELEASED; urgency=low
 +
 +  [ Julian Andres Klode ]
 +  * apt-pkg/depcache.cc:
 +    - Really release action groups only once (Closes: #622744)
 +    - Make purge work again for config-files (LP: #244598) (Closes: #150831)
 +  * debian/apt.cron.daily:
 +    - Check power after wait, patch by manuel-soto (LP: #705269)
 +  * debian/control:
 +    - Move ${shlibs:Depends} to Pre-Depends, as we do not want APT
 +      unpacked if a library is too old and thus break upgrades
 +  * doc/apt-key.8.xml:
 +    - Document apt-key net-update (LP: #192810)
 +
 +  [ Christian Perrier ]
 +  * Galician translation update (Miguel Anxo Bouzada). Closes: #626505
 +
 +  [ David Kalnischkies ]
 +  * fix a bunch of cppcheck warnings/errors based on a patch by
 +    Niels Thykier, thanks! (Closes: #622805)
 +  * apt-pkg/depcache.cc:
 +    - really include 'rc' packages in the delete count by fixing a
 +      typo which exists since 1999 in the source… (LP: #761175)
 +    - if critical or-group can't be satisfied, exit directly.
 +  * apt-pkg/acquire-method.cc:
 +    - write directly to stdout instead of creating the message in
 +      memory first before writing to avoid hitting limits
 +    - fix order of CurrentURI and UsedMirror in Status() and Log()
 +  * apt-pkg/orderlist.cc:
 +    - let VisitRProvides report if the calls were successful
 +  * apt-pkg/deb/dpkgpm.cc:
 +    - replace obsolete usleep with nanosleep
 +  * debian/apt{,-utils}.symbols:
 +    - update both experimental symbol-files to reflect 0.8.14 state
 +  * debian/rules:
 +    - remove unused embedded jquery by doxygen from libapt-pkg-doc
 +  * cmdline/apt-mark.cc:
 +    - reimplement apt-mark in c++
 +    - provide a 'showmanual' command (Closes: #582791)
 +    - provide a 'dpkg --set-selections' wrapper to set/release holds
 +  * cmdline/apt-get.cc:
 +    - deprecate mostly undocumented 'markauto' in favor of 'apt-mark'
 +  * cmdline/apt-cache.cc:
 +    - deprecate mostly undocumented 'showauto' in favor of 'apt-mark'
 +  * apt-pkg/pkgcache.cc:
 +    - really ignore :arch in FindPkg() in non-multiarch environment
 +  * doc/po/de.po:
 +    - undo the translation of the command 'dump' in manpage of apt-config
 +      as report by Burghard Grossmann on debian-l10n-german, thanks!
 +  * apt-pkg/deb/debmetaindex.cc:
 +    - do not download TranslationIndex if no Translation-* will be
 +      downloaded later on anyway (Closes: #624218)
 +  * test/versions.lst:
 +    - disable obscure version number tests with versions dpkg doesn't
 +      allow any more as they don't start with a number
 +  * apt-pkg/acquire-worker.cc:
 +    - print filename in the unmatching size warning (Closes: #623137)
 +  * apt-pkg/acquire-item.cc:
 +    - apply fix for poorly worded 'locate file' error message from
 +      Ben Finney, thanks! (Closes: #623171)
 +  * methods/http.cc:
 +    - add config option to ignore a closed stdin to be able to easily
 +      use the method as a simple standalone downloader
 +    - Location header in redirects should be absolute URI, but some
 +      servers just send an absolute path so still deal with it properly
 +    - dequote URL taken from Location in redirects as we will otherwise
 +      quote an already quoted string in the request later (Closes: #602412)
 +  * apt-pkg/contrib/netrc.cc:
 +    - replace non-posix gnu-extension strdupa with strdup
 +  * apt-pkg/packagemanager.cc:
 +    - ensure for Multi-Arch:same packages that they are unpacked in
 +      lock step even in immediate configuration (Closes: #618288)
 +
 + -- Michael Vogt <mvo@debian.org>  Mon, 16 May 2011 14:57:52 +0200
 +
  apt (0.8.14.1) unstable; urgency=low
  
    * apt-pkg/acquire-item.cc:
diff --combined debian/rules
index ef30568d5c9a680bbd255c8552a18ac4c21be260,6409006788aa17e2b12e0138b9b8ff0fbba81f62..1446a039ee514f60c99f28f03dfcf95a1e6d6cfc
@@@ -62,7 -62,7 +62,7 @@@ configure.in
  endif
  
  # APT Programs in apt-utils
 -APT_UTILS=ftparchive sortpkgs extracttemplates
 +APT_UTILS=ftparchive sortpkgs extracttemplates internal-solver
  
  # Uncomment this to turn on verbose mode.
  #export DH_VERBOSE=1
@@@ -70,9 -70,9 +70,9 @@@
  # Find the libapt-pkg major version for use in other control files
  include buildlib/libversion.mak
  
 -# Determine which package we should provide in the control files
 -LIBAPTPKG_PROVIDE=libapt-pkg$(LIBAPTPKG_MAJOR)
 -LIBAPTINST_PROVIDE=libapt-inst$(LIBAPTINST_MAJOR)
 +# Determine which library package names to use
 +LIBAPT_PKG=libapt-pkg$(LIBAPTPKG_MAJOR)
 +LIBAPT_INST=libapt-inst$(LIBAPTINST_MAJOR)
  
  # do not fail as we are just experimenting with symbol files for now
  export DPKG_GENSYMBOLS_CHECK_LEVEL=0
@@@ -97,10 -97,6 +97,10 @@@ build/configure-stamp: configur
  build/build-stamp: build/configure-stamp
        # Add here commands to compile the package.
        $(MAKE) binary
 +      # compat symlink for the locale split
 +      mkdir -p build/usr/share 
 +      cd build/usr/share && ln -f -s ../../locale .
 +      # done here
        touch $@
  
  build/build-doc-stamp: build/configure-stamp
@@@ -124,9 -120,6 +124,6 @@@ libapt-pkg-doc: build-do
  #
  # libapt-pkg-doc install
  #
-       # remove doxygen's embedded jquery as we don't use it anyway (#622147)
-       rm -f $(BLD)/doc/doxygen/html/jquery.js
        dh_installdocs -p$@ $(BLD)/docs/design* \
                            $(BLD)/docs/dpkg-tech* \
                            $(BLD)/docs/files* \
        dh_compress -p$@
        dh_fixperms -p$@
        dh_installdeb -p$@
 -      dh_gencontrol -p$@ -- -Vlibapt-pkg:provides=$(LIBAPTPKG_PROVIDE)
 +      dh_gencontrol -p$@
        dh_md5sums -p$@
        dh_builddeb -p$@
  
@@@ -169,7 -162,7 +166,7 @@@ apt-doc: build-do
  
  # Build architecture-dependent files here.
  
 -binary-arch: apt libapt-pkg-dev apt-utils apt-transport-https
 +binary-arch: $(LIBAPT_PKG) $(LIBAPT_INST) apt libapt-pkg-dev apt-utils apt-transport-https
  apt_MANPAGES = apt-cache apt-cdrom apt-config apt-get apt-key apt-mark apt-secure apt apt.conf apt_preferences sources.list
  apt: build build-doc
        dh_testdir -p$@
        dh_install -p$@ --sourcedir=$(BLD)
  
        # Remove the bits that are in apt-utils
 -      rm $(addprefix debian/$@/usr/bin/apt-,$(APT_UTILS))
 +      rm $(addprefix debian/$@/usr/bin/apt-,$(APT_UTILS) dump-solver)
  
        # https has its own package
        rm debian/$@/usr/lib/apt/methods/https
        dh_strip -p$@
        dh_compress -p$@
        dh_fixperms -p$@
 -      dh_makeshlibs -p$@
        dh_installdeb -p$@
 -      dh_shlibdeps -p$@ -l$(CURDIR)/debian/apt/usr/lib:$(CURDIR)/debian/$@/usr/lib
 -      dh_gencontrol -p$@ -- -Vlibapt-pkg:provides=$(LIBAPTPKG_PROVIDE)
 +      dh_shlibdeps -p$@
 +      dh_gencontrol -p$@
        dh_md5sums -p$@
        dh_builddeb -p$@
  
@@@ -230,7 -224,7 +227,7 @@@ libapt-pkg-dev: buil
        dh_compress -p$@
        dh_fixperms -p$@
        dh_installdeb -p$@
 -      dh_gencontrol -p$@ -- -Vlibapt-pkg:provides=$(LIBAPTPKG_PROVIDE) -Vlibapt-inst:provides=$(LIBAPTINST_PROVIDE)
 +      dh_gencontrol -p$@ -- -Vlibapt-pkg-name=$(LIBAPT_PKG) -Vlibapt-inst-name=$(LIBAPT_INST)
        dh_md5sums -p$@
        dh_builddeb -p$@
  
@@@ -242,10 -236,8 +239,10 @@@ apt-utils: buil
        dh_installdirs -p$@
  
        cp $(addprefix $(BLD)/bin/apt-,$(APT_UTILS)) debian/$@/usr/bin/
 +      cp $(BLD)/bin/apt-dump-solver debian/$@/usr/lib/apt/solvers/dump
  
        dh_install -p$@ --sourcedir=$(BLD)
 +      dh_link -p$@
        dh_installdocs -p$@
        dh_installexamples -p$@
  
        dh_fixperms -p$@
        dh_makeshlibs -p$@
        dh_installdeb -p$@
 -      dh_shlibdeps -p$@ -l$(CURDIR)/debian/apt/usr/lib:$(CURDIR)/debian/$@/usr/lib
 -      dh_gencontrol -p$@ -- -Vlibapt-inst:provides=$(LIBAPTINST_PROVIDE)
 +      dh_shlibdeps -p$@
 +      dh_gencontrol -p$@
 +      dh_md5sums -p$@
 +      dh_builddeb -p$@
 +
 +$(LIBAPT_PKG): build
 +      dh_testdir -p$@
 +      dh_testroot -p$@
 +      dh_prep -p$@
 +      dh_installdirs -p$@
 +
 +      dh_install -p$@ --sourcedir=$(BLD)
 +      dh_installdocs -p$@
 +      dh_installchangelogs -p$@
 +      dh_strip -p$@
 +      dh_compress -p$@
 +      dh_fixperms -p$@
 +      dh_makeshlibs -p$@
 +      dh_installdeb -p$@
 +      dh_shlibdeps -p$@ 
 +      dh_gencontrol -p$@
 +      dh_md5sums -p$@
 +      dh_builddeb -p$@
 +
 +$(LIBAPT_INST): build
 +      dh_testdir -p$@
 +      dh_testroot -p$@
 +      dh_prep -p$@
 +      dh_installdirs -p$@
 +
 +      dh_install -p$@ --sourcedir=$(BLD)
 +      dh_installdocs -p$@
 +      dh_installchangelogs -p$@
 +      dh_strip -p$@
 +      dh_compress -p$@
 +      dh_fixperms -p$@
 +      dh_makeshlibs -p$@
 +      dh_installdeb -p$@
 +      dh_shlibdeps -p$@ 
 +      dh_gencontrol -p$@
        dh_md5sums -p$@
        dh_builddeb -p$@
  
@@@ -319,7 -273,7 +316,7 @@@ apt-transport-https: build libapt-pkg-d
        dh_compress -p$@
        dh_fixperms -p$@
        dh_installdeb -p$@
 -      dh_shlibdeps -p$@ -l$(CURDIR)/debian/apt/usr/lib:$(CURDIR)/debian/$@/usr/lib
 +      dh_shlibdeps -p$@ 
        dh_gencontrol -p$@
        dh_md5sums -p$@
        dh_builddeb -p$@