]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-cache.cc
* apt-pkg/contrib/error.{cc,h}:
[apt.git] / cmdline / apt-cache.cc
index b782c70af20cf68aa410cac5f6b9720d9cc1adc6..c790559e72a9ddd842edf5094513c093839522ee 100644 (file)
@@ -29,7 +29,8 @@
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/algorithms.h>
 #include <apt-pkg/sptr.h>
-#include <apt-pkg/cacheset.h>
+
+#include "cacheset.h"
 
 #include <config.h>
 #include <apti18n.h>
@@ -81,18 +82,8 @@ void LocalitySort(pkgCache::DescFile **begin,
 // UnMet - Show unmet dependencies                                     /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool UnMet(CommandLine &CmdL)
+bool ShowUnMet(pkgCache::VerIterator const &V, bool const &Important)
 {
-   bool const Important = _config->FindB("APT::Cache::Important",false);
-
-   pkgCacheFile CacheFile;
-   if (unlikely(CacheFile.GetPkgCache() == NULL))
-      return false;
-
-   for (pkgCache::PkgIterator P = CacheFile.GetPkgCache()->PkgBegin(); P.end() == false; P++)
-   {
-      for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
-      {
         bool Header = false;
         for (pkgCache::DepIterator D = V.DependsList(); D.end() == false;)
         {
@@ -100,20 +91,19 @@ bool UnMet(CommandLine &CmdL)
            pkgCache::DepIterator Start;
            pkgCache::DepIterator End;
            D.GlobOr(Start,End);
-           
-           // Skip conflicts and replaces
-           if (End->Type != pkgCache::Dep::PreDepends &&
-               End->Type != pkgCache::Dep::Depends && 
-               End->Type != pkgCache::Dep::Suggests &&
-               End->Type != pkgCache::Dep::Recommends)
-              continue;
 
            // Important deps only
            if (Important == true)
               if (End->Type != pkgCache::Dep::PreDepends &&
                   End->Type != pkgCache::Dep::Depends)
                  continue;
-           
+
+           // Skip conflicts and replaces
+           if (End->Type == pkgCache::Dep::DpkgBreaks ||
+               End->Type == pkgCache::Dep::Replaces ||
+               End->Type == pkgCache::Dep::Conflicts)
+              continue;
+
            // Verify the or group
            bool OK = false;
            pkgCache::DepIterator RealStart = Start;
@@ -142,7 +132,7 @@ bool UnMet(CommandLine &CmdL)
            // Oops, it failed..
            if (Header == false)
               ioprintf(cout,_("Package %s version %s has an unmet dep:\n"),
-                       P.FullName(true).c_str(),V.VerStr());
+                       V.ParentPkg().FullName(true).c_str(),V.VerStr());
            Header = true;
            
            // Print out the dep type
@@ -164,9 +154,31 @@ bool UnMet(CommandLine &CmdL)
            while (1);
            
            cout << endl;
-        }       
-      }
-   }   
+        }
+   return true;
+}
+bool UnMet(CommandLine &CmdL)
+{
+   bool const Important = _config->FindB("APT::Cache::Important",false);
+
+   pkgCacheFile CacheFile;
+   if (unlikely(CacheFile.GetPkgCache() == NULL))
+      return false;
+
+   if (CmdL.FileSize() <= 1)
+   {
+      for (pkgCache::PkgIterator P = CacheFile.GetPkgCache()->PkgBegin(); P.end() == false; P++)
+        for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V)
+           if (ShowUnMet(V, Important) == false)
+              return false;
+   }
+   else
+   {
+      APT::VersionSet verset = APT::VersionSet::FromCommandLine(CacheFile, CmdL.FileList + 1);
+      for (APT::VersionSet::iterator V = verset.begin(); V != verset.end(); ++V)
+        if (ShowUnMet(V, Important) == false)
+           return false;
+   }
    return true;
 }
                                                                        /*}}}*/
@@ -776,38 +788,24 @@ bool XVcg(CommandLine &CmdL)
            ShapeMap[Pkg->ID] = 3;
       }
    }
-   
+
    // Load the list of packages from the command line into the show list
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   std::list<APT::PackageSet::Modifier> mods;
+   mods.push_back(APT::PackageSet::Modifier(0, ",", APT::PackageSet::Modifier::POSTFIX));
+   mods.push_back(APT::PackageSet::Modifier(1, "^", APT::PackageSet::Modifier::POSTFIX));
+   std::map<unsigned short, APT::PackageSet> pkgsets =
+               APT::PackageSet::GroupedFromCommandLine(CacheFile, CmdL.FileList + 1, mods, 0);
+
+   for (APT::PackageSet::const_iterator Pkg = pkgsets[0].begin();
+       Pkg != pkgsets[0].end(); ++Pkg)
+      Show[Pkg->ID] = ToShow;
+   for (APT::PackageSet::const_iterator Pkg = pkgsets[1].begin();
+       Pkg != pkgsets[1].end(); ++Pkg)
    {
-      // Process per-package flags
-      string P = *I;
-      bool Force = false;
-      if (P.length() > 3)
-      {
-        if (P.end()[-1] == '^')
-        {
-           Force = true;
-           P.erase(P.end()-1);
-        }
-        
-        if (P.end()[-1] == ',')
-           P.erase(P.end()-1);
-      }
-      
-      // Locate the package
-      pkgCache::PkgIterator Pkg = Cache->FindPkg(P);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
       Show[Pkg->ID] = ToShow;
-      
-      if (Force == true)
-        Flags[Pkg->ID] |= ForceNR;
+      Flags[Pkg->ID] |= ForceNR;
    }
-   
+
    // Little header
    cout << "graph: { title: \"packages\"" << endl <<
      "xmax: 700 ymax: 700 x: 30 y: 30" << endl <<
@@ -1004,38 +1002,24 @@ bool Dotty(CommandLine &CmdL)
            ShapeMap[Pkg->ID] = 3;
       }
    }
-   
+
    // Load the list of packages from the command line into the show list
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   std::list<APT::PackageSet::Modifier> mods;
+   mods.push_back(APT::PackageSet::Modifier(0, ",", APT::PackageSet::Modifier::POSTFIX));
+   mods.push_back(APT::PackageSet::Modifier(1, "^", APT::PackageSet::Modifier::POSTFIX));
+   std::map<unsigned short, APT::PackageSet> pkgsets =
+               APT::PackageSet::GroupedFromCommandLine(CacheFile, CmdL.FileList + 1, mods, 0);
+
+   for (APT::PackageSet::const_iterator Pkg = pkgsets[0].begin();
+       Pkg != pkgsets[0].end(); ++Pkg)
+      Show[Pkg->ID] = ToShow;
+   for (APT::PackageSet::const_iterator Pkg = pkgsets[1].begin();
+       Pkg != pkgsets[1].end(); ++Pkg)
    {
-      // Process per-package flags
-      string P = *I;
-      bool Force = false;
-      if (P.length() > 3)
-      {
-        if (P.end()[-1] == '^')
-        {
-           Force = true;
-           P.erase(P.end()-1);
-        }
-        
-        if (P.end()[-1] == ',')
-           P.erase(P.end()-1);
-      }
-      
-      // Locate the package
-      pkgCache::PkgIterator Pkg = Cache->FindPkg(P);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
       Show[Pkg->ID] = ToShow;
-      
-      if (Force == true)
-        Flags[Pkg->ID] |= ForceNR;
+      Flags[Pkg->ID] |= ForceNR;
    }
-   
+
    // Little header
    printf("digraph packages {\n");
    printf("concentrate=true;\n");
@@ -1232,11 +1216,11 @@ bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V)
    pkgCache::PkgFileIterator I = Vf.File();
    if (I.IsOk() == false)
       return _error->Error(_("Package file %s is out of sync."),I.FileName());
-   
-   FileFd PkgF(I.FileName(),FileFd::ReadOnly);
-   if (_error->PendingError() == true)
+
+   FileFd PkgF;
+   if (PkgF.Open(I.FileName(), FileFd::ReadOnly) == false)
       return false;
-   
+
    // Read the record
    unsigned char *Buffer = new unsigned char[Cache->HeaderP->MaxVerFileSize+1];
    Buffer[V.FileList()->Size] = '\n';
@@ -1884,21 +1868,21 @@ int main(int argc,const char *argv[])                                   /*{{{*/
    }
    
    // Deal with stdout not being a tty
-   if (isatty(STDOUT_FILENO) && _config->FindI("quiet",0) < 1)
+   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
       _config->Set("quiet","1");
 
-//       if (_config->FindB("APT::Cache::Generate",true) == false)
+   if (_config->Exists("APT::Cache::Generate") == true)
+      _config->Set("pkgCacheFile::Generate", _config->FindB("APT::Cache::Generate", true));
+
    if (CmdL.DispatchArg(CmdsA,false) == false && _error->PendingError() == false)
       CmdL.DispatchArg(CmdsB);
 
    // Print any errors or warnings found during parsing
-   if (_error->empty() == false)
-   {
-      bool Errors = _error->PendingError();
+   bool const Errors = _error->PendingError();
+   if (_config->FindI("quiet",0) > 0)
       _error->DumpErrors();
-      return Errors == true?100:0;
-   }
-          
-   return 0;
+   else
+      _error->DumpErrors(GlobalError::DEBUG);
+   return Errors == true ? 100 : 0;
 }
                                                                        /*}}}*/