]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-cache.cc
i managed to commit broken codeā€¦ which (at least in my mind) worked
[apt.git] / cmdline / apt-cache.cc
index 355e9aefb7eb38a04b2315c769c8602bcd5b7377..943a001a8bb52ff0e59821abe320b1a7b261004a 100644 (file)
@@ -14,7 +14,9 @@
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
 #include <apt-pkg/error.h>
+#include <cassert>
 #include <apt-pkg/pkgcachegen.h>
+#include <apt-pkg/cachefile.h>
 #include <apt-pkg/init.h>
 #include <apt-pkg/progress.h>
 #include <apt-pkg/sourcelist.h>
@@ -27,6 +29,7 @@
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/algorithms.h>
 #include <apt-pkg/sptr.h>
+#include <apt-pkg/packageset.h>
 
 #include <config.h>
 #include <apti18n.h>
@@ -173,15 +176,10 @@ bool UnMet(CommandLine &CmdL)
 bool DumpPackage(CommandLine &CmdL)
 {   
    pkgCache &Cache = *GCache;
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
-   {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
 
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+   {
       cout << "Package: " << Pkg.FullName(true) << endl;
       cout << "Versions: " << endl;
       for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
@@ -242,7 +240,9 @@ bool DumpPackage(CommandLine &CmdL)
 bool Stats(CommandLine &Cmd)
 {
    pkgCache &Cache = *GCache;
-   cout << _("Total package names: ") << Cache.Head().PackageCount << " (" <<
+   cout << _("Total package names: ") << Cache.Head().GroupCount << " (" <<
+      SizeToStr(Cache.Head().GroupCount*Cache.Head().GroupSz) << ')' << endl
+        << _("Total package structures: ") << Cache.Head().PackageCount << " (" <<
       SizeToStr(Cache.Head().PackageCount*Cache.Head().PackageSz) << ')' << endl;
 
    int Normal = 0;
@@ -541,18 +541,11 @@ bool Depends(CommandLine &CmdL)
    pkgCache &Cache = *GCache;
    SPtrArray<unsigned> Colours = new unsigned[Cache.Head().PackageCount];
    memset(Colours,0,sizeof(*Colours)*Cache.Head().PackageCount);
-   
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
-   {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
       Colours[Pkg->ID] = 1;
-   }
-   
+
    bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
    bool Installed = _config->FindB("APT::Cache::Installed",false);
    bool Important = _config->FindB("APT::Cache::Important",false);
@@ -635,18 +628,11 @@ bool RDepends(CommandLine &CmdL)
    pkgCache &Cache = *GCache;
    SPtrArray<unsigned> Colours = new unsigned[Cache.Head().PackageCount];
    memset(Colours,0,sizeof(*Colours)*Cache.Head().PackageCount);
-   
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
-   {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
       Colours[Pkg->ID] = 1;
-   }
-   
+
    bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
    bool Installed = _config->FindB("APT::Cache::Installed",false);
    bool DidSomething;
@@ -1404,6 +1390,29 @@ bool Search(CommandLine &CmdL)
        return _error->Error("Write to stdout failed");
    return true;
 }
+
+
+/* show automatically installed packages (sorted) */
+bool ShowAuto(CommandLine &CmdL)
+{
+   OpProgress op;
+   pkgDepCache DepCache(GCache);
+   DepCache.Init(&op);
+
+   std::vector<string> packages;
+   packages.reserve(GCache->HeaderP->PackageCount / 3);
+   
+   for (pkgCache::PkgIterator P = GCache->PkgBegin(); P.end() == false; P++)
+      if (DepCache[P].Flags & pkgCache::Flag::Auto)
+         packages.push_back(P.Name());
+
+    std::sort(packages.begin(), packages.end());
+    
+    for (vector<string>::iterator I = packages.begin(); I != packages.end(); I++)
+            cout << *I << "\n";
+
+   return true;
+}
                                                                        /*}}}*/
 // ShowPackage - Dump the package record to the screen                 /*{{{*/
 // ---------------------------------------------------------------------
@@ -1413,23 +1422,9 @@ bool ShowPackage(CommandLine &CmdL)
    pkgCache &Cache = *GCache;
    pkgDepCache::Policy Plcy;
 
-   unsigned found = 0;
-   
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
-      // FIXME: Handle the case in which pkgname name:arch is not found
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        Pkg = Cache.FindPkg(*I, "any");
-        if (Pkg.end() == true) {
-               _error->Warning(_("Unable to locate package %s"),*I);
-               continue;
-        }
-      }
-
-      ++found;
-
       // Find the proper version to use.
       if (_config->FindB("APT::Cache::AllVersions","true") == true)
       {
@@ -1450,7 +1445,7 @@ bool ShowPackage(CommandLine &CmdL)
       }      
    }
 
-   if (found > 0)
+   if (pkgset.empty() == false)
         return true;
    return _error->Error(_("No packages found"));
 }
@@ -1505,15 +1500,26 @@ bool ShowSrcPackage(CommandLine &CmdL)
    if (_error->PendingError() == true)
       return false;
 
+   unsigned found = 0;
    for (const char **I = CmdL.FileList + 1; *I != 0; I++)
    {
       SrcRecs.Restart();
       
       pkgSrcRecords::Parser *Parse;
-      while ((Parse = SrcRecs.Find(*I,false)) != 0)
-        cout << Parse->AsStr() << endl;;
+      unsigned found_this = 0;
+      while ((Parse = SrcRecs.Find(*I,false)) != 0) {
+        cout << Parse->AsStr() << endl;;
+        found++;
+        found_this++;
+      }
+      if (found_this == 0) {
+        _error->Warning(_("Unable to locate package %s"),*I);
+        continue;
+      }
    }      
-   return true;
+   if (found > 0)
+        return true;
+   return _error->Error(_("No packages found"));
 }
                                                                        /*}}}*/
 // Policy - Show the results of the preferences file                   /*{{{*/
@@ -1574,33 +1580,36 @@ bool Policy(CommandLine &CmdL)
    }
 
    string const myArch = _config->Find("APT::Architecture");
+   char const * const msgInstalled = _("  Installed: ");
+   char const * const msgCandidate = _("  Candidate: ");
+   short const InstalledLessCandidate =
+               mbstowcs(NULL, msgInstalled, 0) - mbstowcs(NULL, msgCandidate, 0);
+   short const deepInstalled =
+               (InstalledLessCandidate < 0 ? (InstalledLessCandidate*-1) : 0) - 1;
+   short const deepCandidate =
+               (InstalledLessCandidate > 0 ? (InstalledLessCandidate) : 0) - 1;
 
    // Print out detailed information for each package
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator I = pkgset.begin(); I != pkgset.end(); ++I)
    {
-      pkgCache::GrpIterator Grp = Cache.FindGrp(*I);
-      pkgCache::PkgIterator Pkg = Grp.FindPkg("any");
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+      pkgCache::PkgIterator Pkg = I.Group().FindPkg("any");
 
-      for (; Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) {
+      for (; Pkg.end() != true; Pkg = I.Group().NextPkg(Pkg)) {
       if (strcmp(Pkg.Arch(),"all") == 0)
         continue;
 
       cout << Pkg.FullName(true) << ":" << endl;
 
       // Installed version
-      cout << _("  Installed: ");
+      cout << msgInstalled << OutputInDepth(deepInstalled, " ");
       if (Pkg->CurrentVer == 0)
         cout << _("(none)") << endl;
       else
         cout << Pkg.CurrentVer().VerStr() << endl;
       
       // Candidate Version 
-      cout << _("  Candidate: ");
+      cout << msgCandidate << OutputInDepth(deepCandidate, " ");
       pkgCache::VerIterator V = Plcy.GetCandidateVer(Pkg);
       if (V.end() == true)
         cout << _("(none)") << endl;
@@ -1662,10 +1671,9 @@ bool Madison(CommandLine &CmdL)
    if (_error->PendingError() == true)
       _error->Discard();
 
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-
       if (Pkg.end() == false)
       {
          for (pkgCache::VerIterator V = Pkg.VersionList(); V.end() == false; V++)
@@ -1700,7 +1708,7 @@ bool Madison(CommandLine &CmdL)
       
       SrcRecs.Restart();
       pkgSrcRecords::Parser *SrcParser;
-      while ((SrcParser = SrcRecs.Find(*I,false)) != 0)
+      while ((SrcParser = SrcRecs.Find(Pkg.Name(),false)) != 0)
       {
          // Maybe support Release info here too eventually
          cout << setw(10) << SrcParser->Package() << " | "
@@ -1756,6 +1764,7 @@ bool ShowHelp(CommandLine &Cmd)
       "   unmet - Show unmet dependencies\n"
       "   search - Search the package list for a regex pattern\n"
       "   show - Show a readable record for the package\n"
+      "   showauto - Display a list of automatically installed packages\n"
       "   depends - Show raw dependency information for a package\n"
       "   rdepends - Show reverse dependency information for a package\n"
       "   pkgnames - List the names of all packages in the system\n"
@@ -1820,6 +1829,7 @@ int main(int argc,const char *argv[])                                     /*{{{*/
                                     {"xvcg",&XVcg},
                                     {"show",&ShowPackage},
                                     {"pkgnames",&ShowPkgNames},
+                                    {"showauto",&ShowAuto},
                                     {"policy",&Policy},
                                     {"madison",&Madison},
                                     {0,0}};