]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/algorithms.cc
* ftparchive/multicompress.cc, apt-inst/deb/debfile.cc:
[apt.git] / apt-pkg / algorithms.cc
index a298be4933a74411614b9aa8b1e64d55f0029d9a..66c182b235ed91392fb745e9c463c21ed2b06a7d 100644 (file)
@@ -162,7 +162,28 @@ bool pkgSimulate::Configure(PkgIterator iPkg)
       }
    }
 
-//   Sim.MarkInstall(Pkg,false);
+   if (Sim[Pkg].InstBroken() == true)
+   {
+      /* We don't call Configure for Pseudo packages and if the 'all' is already installed
+         the simulation will think the pseudo package is not installed, so if something is
+         broken we walk over the dependencies and search for not installed pseudo packages */
+      for (pkgCache::DepIterator D = Sim[Pkg].InstVerIter(Sim).DependsList(); D.end() == false; D++)
+      {
+        if (Sim.IsImportantDep(D) == false || 
+            (Sim[D] & pkgDepCache::DepInstall) != 0)
+           continue;
+        pkgCache::PkgIterator T = D.TargetPkg();
+        if (T.end() == true || T->CurrentVer != 0 || Flags[T->ID] != 0)
+           continue;
+        pkgCache::PkgIterator A = T.Group().FindPkg("all");
+        if (A.end() == true || A->VersionList == 0 || A->CurrentVer == 0 ||
+            Cache.VS().CheckDep(A.CurVersion(), pkgCache::Dep::Equals, T.CandVersion()) == false)
+           continue;
+        Sim.MarkInstall(T, false);
+        Flags[T->ID] = 2;
+      }
+   }
+
    if (Sim[Pkg].InstBroken() == true)
    {
       cout << "Conf " << Pkg.FullName(false) << " broken" << endl;
@@ -374,6 +395,13 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
 {
    pkgDepCache::ActionGroup group(Cache);
 
+   /* Upgrade all installed packages first without autoinst to help the resolver
+      in versioned or-groups to upgrade the old solver instead of installing
+      a new one (if the old solver is not the first one [anymore]) */
+   for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
+      if (I->CurrentVer != 0)
+        Cache.MarkInstall(I, false, 0, false);
+
    /* Auto upgrade all installed packages, this provides the basis 
       for the installation */
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
@@ -1062,6 +1090,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
                        else if (TryFixByInstall == true &&
                                 Start.TargetPkg()->CurrentVer == 0 &&
                                 Cache[Start.TargetPkg()].Delete() == false &&
+                                (Flags[Start.TargetPkg()->ID] & ToRemove) != ToRemove &&
                                 Cache.GetCandidateVer(Start.TargetPkg()).end() == false)
                        {
                           /* Before removing or keeping the package with the broken dependency
@@ -1088,7 +1117,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
               {
                  if (Start->Type == pkgCache::Dep::DpkgBreaks)
                  {
-                    // first, try upgrading the package, if that
+                    // first, try upgradring the package, if that
                     // does not help, the breaks goes onto the
                     // kill list
                      //
@@ -1114,7 +1143,6 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
                  LEnd++;
                  
                  if (Start->Type != pkgCache::Dep::Conflicts &&
-                      Start->Type != pkgCache::Dep::DpkgBreaks &&
                      Start->Type != pkgCache::Dep::Obsoletes)
                     break;
               }
@@ -1486,9 +1514,9 @@ bool ListUpdate(pkgAcquireStatus &Stat,
    }
    
    if (TransientNetworkFailure == true)
-      _error->Warning(_("Some index files failed to download, they have been ignored, or old ones used instead."));
+      _error->Warning(_("Some index files failed to download. They have been ignored, or old ones used instead."));
    else if (Failed == true)
-      return _error->Error(_("Some index files failed to download, they have been ignored, or old ones used instead."));
+      return _error->Error(_("Some index files failed to download. They have been ignored, or old ones used instead."));
 
 
    // Run the success scripts if all was fine