]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-get.cc
Make OrderInstall virtual
[apt.git] / cmdline / apt-get.cc
index 3cef602fa1fa0f1709c67abe1022c6b36f074081..c449b3379be71bd7a47be5ea68b0eee0e2c6bbda 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-get.cc,v 1.100 2001/02/20 07:03:17 jgg Exp $
+// $Id: apt-get.cc,v 1.104 2001/03/13 05:23:42 jgg Exp $
 /* ######################################################################
    
    apt-get - Cover for dpkg
@@ -429,7 +429,7 @@ bool ShowEssential(ostream &out,CacheFile &Cache)
            Added[P->ID] = true;
            
            char S[300];
-           sprintf(S,_("%s (due to %s) "),P.Name(),I.Name());
+           snprintf(S,sizeof(S),_("%s (due to %s) "),P.Name(),I.Name());
            List += S;
         }       
       }      
@@ -891,7 +891,7 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
          otherwise this is not really an error. */
       if (AllowFail == false)
         return false;      
-      ioprintf(c1out,_("Package %s is not installed, so not removed"),Pkg.Name());
+      ioprintf(c1out,_("Package %s is not installed, so not removed\n"),Pkg.Name());
       return true;
    }
    
@@ -930,8 +930,8 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
           "of sources.list\n"),Pkg.Name());
         
         string List;
-        SPtrArray<bool> Seen = new bool[Cache.Head().PackageFileCount];
-        memset(Seen,0,Cache.Head().PackageFileCount*sizeof(*Seen));
+        SPtrArray<bool> Seen = new bool[Cache.Head().PackageCount];
+        memset(Seen,0,Cache.Head().PackageCount*sizeof(*Seen));
         pkgCache::DepIterator Dep = Pkg.RevDependsList();
         for (; Dep.end() == false; Dep++)
         {
@@ -1845,24 +1845,41 @@ bool DoBuildDep(CommandLine &CmdL)
         if ((*D).Type == pkgSrcRecords::Parser::BuildConflict || 
             (*D).Type == pkgSrcRecords::Parser::BuildConflictIndep)
         {
-           /* conflict; need to remove if we have an installed version 
-             that satisfies the version criteria */
+           /* 
+            * conflict; need to remove if we have an installed version 
+            * that satisfies the version criterial 
+            */
            if (IV.end() == false && 
                Cache->VS().CheckDep(IV.VerStr(),(*D).Op,(*D).Version.c_str()) == true)
               TryToInstall(Pkg,Cache,Fix,true,false,ExpectedInst);
         } 
         else 
         {
-           /* depends; need to install or upgrade if we don't have the
-              package installed or if the version does not satisfy the
-              build dep. This is complicated by the fact that if we
-              depend on a version lower than what we already have 
-              installed it is not clear what should be done; in practice
-              this case should be rare though and right now nothing
-              is done about it :-( */
-           if (IV.end() == true ||
-               Cache->VS().CheckDep(IV.VerStr(),(*D).Op,(*D).Version.c_str()) == false)
-              TryToInstall(Pkg,Cache,Fix,false,false,ExpectedInst);
+           /* 
+            * If this is a virtual package, we need to check the list of
+            * packages that provide it and see if any of those are
+            * installed
+            */
+            pkgCache::PrvIterator Prv = Pkg.ProvidesList();
+            for (; Prv.end() != true; Prv++)
+              if ((*Cache)[Prv.OwnerPkg()].InstVerIter(*Cache).end() == false)
+                 break;
+
+           if (Prv.end() == true)
+           {
+              /* 
+               * depends; need to install or upgrade if we don't have the
+               * package installed or if the version does not satisfy the
+               * build dep. This is complicated by the fact that if we
+               * depend on a version lower than what we already have 
+               * installed it is not clear what should be done; in practice
+               * this case should be rare though and right now nothing
+               * is done about it :-( 
+               */
+              if (IV.end() == true ||
+                 Cache->VS().CheckDep(IV.VerStr(),(*D).Op,(*D).Version.c_str()) == false)
+                    TryToInstall(Pkg,Cache,Fix,false,false,ExpectedInst);
+           }
         }             
       }