]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/packagemanager.cc
adapt to the new CacheSetHelper API
[apt.git] / apt-pkg / packagemanager.cc
index d9df28ba3132b2c45481c5e29cc9cf11beaec3cb..e4cd1dc3b8ff318a1befbf28a6cf09732fd762c5 100644 (file)
@@ -373,6 +373,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
    std::list<DepIterator> needConfigure;
    do
    {
    std::list<DepIterator> needConfigure;
    do
    {
+      // Check each dependency and see if anything needs to be done
+      // so that it can be configured
       Changed = false;
       for (DepIterator D = instVer.DependsList(); D.end() == false; )
       {
       Changed = false;
       for (DepIterator D = instVer.DependsList(); D.end() == false; )
       {
@@ -384,7 +386,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
            continue;
         Bad = true;
 
            continue;
         Bad = true;
 
-        // Check for dependencies that have not been unpacked, probably due to loops.
+         // the first pass checks if we its all good, i.e. if we have
+         // to do anything at all
         for (DepIterator Cur = Start; true; ++Cur)
         {
            SPtrArray<Version *> VList = Cur.AllTargets();
         for (DepIterator Cur = Start; true; ++Cur)
         {
            SPtrArray<Version *> VList = Cur.AllTargets();
@@ -403,6 +406,47 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
                  break;
               }
 
                  break;
               }
 
+              // Check if the version that is going to be installed will satisfy the dependency
+              if (Cache[DepPkg].InstallVer != *I || List->IsNow(DepPkg) == false)
+                 continue;
+
+              if (PkgLoop == true)
+              {
+                 if (Debug)
+                    std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
+                 Bad = false;
+              }
+           }
+
+            if (Cur == End || Bad == false)
+              break;
+         }
+
+         // this dependency is in a good state, so we can stop
+         if (Bad == false)
+         {
+            if (Debug)
+               std::clog << OutputInDepth(Depth) << "Found ok dep " << D.TargetPkg() << std::endl;
+            continue;
+         }
+
+        // Check for dependencies that have not been unpacked, 
+         // probably due to loops.
+        for (DepIterator Cur = Start; true; ++Cur)
+        {
+           SPtrArray<Version *> VList = Cur.AllTargets();
+
+           for (Version **I = VList; *I != 0; ++I)
+           {
+              VerIterator Ver(Cache,*I);
+              PkgIterator DepPkg = Ver.ParentPkg();
+
+              // Check if the current version of the package is available and will satisfy this dependency
+              if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
+                  List->IsFlag(DepPkg,pkgOrderList::Removed) == false &&
+                  DepPkg.State() == PkgIterator::NeedsNothing)
+                  continue;
+
               // Check if the version that is going to be installed will satisfy the dependency
               if (Cache[DepPkg].InstallVer != *I || List->IsNow(DepPkg) == false)
                  continue;
               // Check if the version that is going to be installed will satisfy the dependency
               if (Cache[DepPkg].InstallVer != *I || List->IsNow(DepPkg) == false)
                  continue;
@@ -420,6 +464,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
                  if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
                     return false;
               }
                  if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
                     return false;
               }
+               // at this point we either unpacked a Dep or we are in a loop,
+               // no need to unpack a second one
               break;
            }
 
               break;
            }
 
@@ -436,6 +482,7 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
          return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack (1) for %s, aborting", Pkg.FullName().c_str());
    } while (Changed == true);
 
          return _error->Error("Internal error: MaxLoopCount reached in SmartUnPack (1) for %s, aborting", Pkg.FullName().c_str());
    } while (Changed == true);
 
+   // now go over anything that needs configuring
    Bad = false, Changed = false, i = 0;
    do
    {
    Bad = false, Changed = false, i = 0;
    do
    {