]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-cache.cc
* apt-pkg/deb/debrecords.cc:
[apt.git] / cmdline / apt-cache.cc
index 4e16b8c1180e310a1616c0b54092d0a8738a7aaa..10dbf44d24ff37c6dae5f5c44d07aeb371b8c633 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>
@@ -71,6 +73,12 @@ void LocalitySort(pkgCache::VerFile **begin,
 {   
    qsort(begin,Count,Size,LocalityCompare);
 }
+
+void LocalitySort(pkgCache::DescFile **begin,
+                 unsigned long Count,size_t Size)
+{   
+   qsort(begin,Count,Size,LocalityCompare);
+}
                                                                        /*}}}*/
 // UnMet - Show unmet dependencies                                     /*{{{*/
 // ---------------------------------------------------------------------
@@ -96,13 +104,13 @@ bool UnMet(CommandLine &CmdL)
            if (End->Type != pkgCache::Dep::PreDepends &&
                End->Type != pkgCache::Dep::Depends && 
                End->Type != pkgCache::Dep::Suggests &&
-               End->Type != pkgCache::Dep::Recommends)
+               End->Type != pkgCache::Dep::Recommends)
               continue;
 
            // Important deps only
            if (Important == true)
               if (End->Type != pkgCache::Dep::PreDepends &&
-                  End->Type != pkgCache::Dep::Depends)
+                  End->Type != pkgCache::Dep::Depends)
                  continue;
            
            // Verify the or group
@@ -133,7 +141,7 @@ bool UnMet(CommandLine &CmdL)
            // Oops, it failed..
            if (Header == false)
               ioprintf(cout,_("Package %s version %s has an unmet dep:\n"),
-                       P.Name(),V.VerStr());
+                       P.FullName(true).c_str(),V.VerStr());
            Header = true;
            
            // Print out the dep type
@@ -143,7 +151,7 @@ bool UnMet(CommandLine &CmdL)
            Start = RealStart;
            do
            {
-              cout << Start.TargetPkg().Name();
+              cout << Start.TargetPkg().FullName(true);
               if (Start.TargetVer() != 0)
                  cout << " (" << Start.CompType() << " " << Start.TargetVer() <<
                  ")";
@@ -176,13 +184,20 @@ bool DumpPackage(CommandLine &CmdL)
         continue;
       }
 
-      cout << "Package: " << Pkg.Name() << endl;
+      cout << "Package: " << Pkg.FullName(true) << endl;
       cout << "Versions: " << endl;
       for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
       {
         cout << Cur.VerStr();
         for (pkgCache::VerFileIterator Vf = Cur.FileList(); Vf.end() == false; Vf++)
-           cout << "(" << Vf.File().FileName() << ")";
+           cout << " (" << Vf.File().FileName() << ")";
+        cout << endl;
+        for (pkgCache::DescIterator D = Cur.DescriptionList(); D.end() == false; D++)
+        {
+           cout << " Description Language: " << D.LanguageCode() << endl
+                << "                 File: " << D.FileList().File().FileName() << endl
+                << "                  MD5: " << D.md5() << endl;
+        }
         cout << endl;
       }
       
@@ -191,7 +206,7 @@ bool DumpPackage(CommandLine &CmdL)
       cout << "Reverse Depends: " << endl;
       for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() != true; D++)
       {
-        cout << "  " << D.ParentPkg().Name() << ',' << D.TargetPkg().Name();
+        cout << "  " << D.ParentPkg().FullName(true) << ',' << D.TargetPkg().FullName(true);
         if (D->Version != 0)
            cout << ' ' << DeNull(D.TargetVer()) << endl;
         else
@@ -203,7 +218,7 @@ bool DumpPackage(CommandLine &CmdL)
       {
         cout << Cur.VerStr() << " - ";
         for (pkgCache::DepIterator Dep = Cur.DependsList(); Dep.end() != true; Dep++)
-           cout << Dep.TargetPkg().Name() << " (" << (int)Dep->CompareOp << " " << DeNull(Dep.TargetVer()) << ") ";
+           cout << Dep.TargetPkg().FullName(true) << " (" << (int)Dep->CompareOp << " " << DeNull(Dep.TargetVer()) << ") ";
         cout << endl;
       }      
 
@@ -212,12 +227,12 @@ bool DumpPackage(CommandLine &CmdL)
       {
         cout << Cur.VerStr() << " - ";
         for (pkgCache::PrvIterator Prv = Cur.ProvidesList(); Prv.end() != true; Prv++)
-           cout << Prv.ParentPkg().Name() << " ";
+           cout << Prv.ParentPkg().FullName(true) << " ";
         cout << endl;
       }
       cout << "Reverse Provides: " << endl;
       for (pkgCache::PrvIterator Prv = Pkg.ProvidesList(); Prv.end() != true; Prv++)
-        cout << Prv.OwnerPkg().Name() << " " << Prv.OwnerVer().VerStr() << endl;            
+        cout << Prv.OwnerPkg().FullName(true) << " " << Prv.OwnerVer().VerStr() << endl;
    }
 
    return true;
@@ -229,7 +244,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;
@@ -269,20 +286,24 @@ bool Stats(CommandLine &Cmd)
         continue;
       }
    }
-   cout << _("  Normal Packages: ") << Normal << endl;
-   cout << _("  Pure Virtual Packages: ") << Virtual << endl;
-   cout << _("  Single Virtual Packages: ") << DVirt << endl;
-   cout << _("  Mixed Virtual Packages: ") << NVirt << endl;
+   cout << _("  Normal packages: ") << Normal << endl;
+   cout << _("  Pure virtual packages: ") << Virtual << endl;
+   cout << _("  Single virtual packages: ") << DVirt << endl;
+   cout << _("  Mixed virtual packages: ") << NVirt << endl;
    cout << _("  Missing: ") << Missing << endl;
    
-   cout << _("Total Distinct Versions: ") << Cache.Head().VersionCount << " (" <<
+   cout << _("Total distinct versions: ") << Cache.Head().VersionCount << " (" <<
       SizeToStr(Cache.Head().VersionCount*Cache.Head().VersionSz) << ')' << endl;
-   cout << _("Total Dependencies: ") << Cache.Head().DependsCount << " (" << 
+   cout << _("Total distinct descriptions: ") << Cache.Head().DescriptionCount << " (" <<
+      SizeToStr(Cache.Head().DescriptionCount*Cache.Head().DescriptionSz) << ')' << endl;
+   cout << _("Total dependencies: ") << Cache.Head().DependsCount << " (" << 
       SizeToStr(Cache.Head().DependsCount*Cache.Head().DependencySz) << ')' << endl;
    
-   cout << _("Total Ver/File relations: ") << Cache.Head().VerFileCount << " (" <<
+   cout << _("Total ver/file relations: ") << Cache.Head().VerFileCount << " (" <<
       SizeToStr(Cache.Head().VerFileCount*Cache.Head().VerFileSz) << ')' << endl;
-   cout << _("Total Provides Mappings: ") << Cache.Head().ProvidesCount << " (" <<
+   cout << _("Total Desc/File relations: ") << Cache.Head().DescFileCount << " (" <<
+      SizeToStr(Cache.Head().DescFileCount*Cache.Head().DescFileSz) << ')' << endl;
+   cout << _("Total Provides mappings: ") << Cache.Head().ProvidesCount << " (" <<
       SizeToStr(Cache.Head().ProvidesCount*Cache.Head().ProvidesSz) << ')' << endl;
    
    // String list stats
@@ -294,7 +315,7 @@ bool Stats(CommandLine &Cmd)
       Count++;
       Size += strlen(Cache.StrP + I->String) + 1;
    }
-   cout << _("Total Globbed Strings: ") << Count << " (" << SizeToStr(Size) << ')' << endl;
+   cout << _("Total globbed strings: ") << Count << " (" << SizeToStr(Size) << ')' << endl;
 
    unsigned long DepVerSize = 0;
    for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
@@ -308,12 +329,12 @@ bool Stats(CommandLine &Cmd)
         }
       }
    }
-   cout << _("Total Dependency Version space: ") << SizeToStr(DepVerSize) << endl;
+   cout << _("Total dependency version space: ") << SizeToStr(DepVerSize) << endl;
    
    unsigned long Slack = 0;
    for (int I = 0; I != 7; I++)
       Slack += Cache.Head().Pools[I].ItemSize*Cache.Head().Pools[I].Count;
-   cout << _("Total Slack space: ") << SizeToStr(Slack) << endl;
+   cout << _("Total slack space: ") << SizeToStr(Slack) << endl;
    
    unsigned long Total = 0;
    Total = Slack + Size + Cache.Head().DependsCount*Cache.Head().DependencySz + 
@@ -321,7 +342,7 @@ bool Stats(CommandLine &Cmd)
            Cache.Head().PackageCount*Cache.Head().PackageSz + 
            Cache.Head().VerFileCount*Cache.Head().VerFileSz +
            Cache.Head().ProvidesCount*Cache.Head().ProvidesSz;
-   cout << _("Total Space Accounted for: ") << SizeToStr(Total) << endl;
+   cout << _("Total space accounted for: ") << SizeToStr(Total) << endl;
    
    return true;
 }
@@ -336,14 +357,20 @@ bool Dump(CommandLine &Cmd)
    
    for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
    {
-      cout << "Package: " << P.Name() << endl;
+      cout << "Package: " << P.FullName(true) << endl;
       for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
       {
         cout << " Version: " << V.VerStr() << endl;
         cout << "     File: " << V.FileList().File().FileName() << endl;
         for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++)
-           cout << "  Depends: " << D.TargetPkg().Name() << ' ' << 
+           cout << "  Depends: " << D.TargetPkg().FullName(true) << ' ' << 
                             DeNull(D.TargetVer()) << endl;
+        for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; D++)
+        {
+           cout << " Description Language: " << D.LanguageCode() << endl
+                << "                 File: " << D.FileList().File().FileName() << endl
+                << "                  MD5: " << D.md5() << endl;
+        } 
       }      
    }
 
@@ -376,7 +403,7 @@ bool DumpAvail(CommandLine &Cmd)
    pkgCache &Cache = *GCache;
 
    pkgPolicy Plcy(&Cache);
-   if (ReadPinFile(Plcy) == false)
+   if (ReadPinFile(Plcy) == false || ReadPinDir(Plcy) == false)
       return false;
    
    unsigned long Count = Cache.HeaderP->PackageCount+1;
@@ -532,6 +559,7 @@ bool Depends(CommandLine &CmdL)
    
    bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
    bool Installed = _config->FindB("APT::Cache::Installed",false);
+   bool Important = _config->FindB("APT::Cache::Important",false);
    bool DidSomething;
    do
    {
@@ -546,15 +574,20 @@ bool Depends(CommandLine &CmdL)
         pkgCache::VerIterator Ver = Pkg.VersionList();
         if (Ver.end() == true)
         {
-           cout << '<' << Pkg.Name() << '>' << endl;
+           cout << '<' << Pkg.FullName(true) << '>' << endl;
            continue;
         }
         
-        cout << Pkg.Name() << endl;
+        cout << Pkg.FullName(true) << endl;
         
         for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
         {
-
+           // Important deps only
+           if (Important == true)
+              if (D->Type != pkgCache::Dep::PreDepends &&
+                  D->Type != pkgCache::Dep::Depends)
+                 continue;
+                 
            pkgCache::PkgIterator Trg = D.TargetPkg();
 
            if((Installed && Trg->CurrentVer != 0) || !Installed)
@@ -567,9 +600,9 @@ bool Depends(CommandLine &CmdL)
            
                // Show the package
                if (Trg->VersionList == 0)
-                 cout << D.DepType() << ": <" << Trg.Name() << ">" << endl;
+                 cout << D.DepType() << ": <" << Trg.FullName(true) << ">" << endl;
                else
-                 cout << D.DepType() << ": " << Trg.Name() << endl;
+                 cout << D.DepType() << ": " << Trg.FullName(true) << endl;
            
                if (Recurse == true)
                  Colours[D.TargetPkg()->ID]++;
@@ -585,7 +618,7 @@ bool Depends(CommandLine &CmdL)
               if (V != Cache.VerP + V.ParentPkg()->VersionList ||
                   V->ParentPkg == D->Package)
                  continue;
-              cout << "    " << V.ParentPkg().Name() << endl;
+              cout << "    " << V.ParentPkg().FullName(true) << endl;
               
               if (Recurse == true)
                  Colours[D.ParentPkg()->ID]++;
@@ -597,7 +630,7 @@ bool Depends(CommandLine &CmdL)
    
    return true;
 }
-
+                                                                       /*}}}*/
 // RDepends - Print out a reverse dependency tree - mbc                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -634,11 +667,11 @@ bool RDepends(CommandLine &CmdL)
         pkgCache::VerIterator Ver = Pkg.VersionList();
         if (Ver.end() == true)
         {
-           cout << '<' << Pkg.Name() << '>' << endl;
+           cout << '<' << Pkg.FullName(true) << '>' << endl;
            continue;
         }
         
-        cout << Pkg.Name() << endl;
+        cout << Pkg.FullName(true) << endl;
         
         cout << "Reverse Depends:" << endl;
         for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() == false; D++)
@@ -655,9 +688,9 @@ bool RDepends(CommandLine &CmdL)
                  cout << "  ";
 
                if (Trg->VersionList == 0)
-                 cout << D.DepType() << ": <" << Trg.Name() << ">" << endl;
+                 cout << D.DepType() << ": <" << Trg.FullName(true) << ">" << endl;
                else
-                 cout << Trg.Name() << endl;
+                 cout << Trg.FullName(true) << endl;
 
                if (Recurse == true)
                  Colours[D.ParentPkg()->ID]++;
@@ -673,7 +706,7 @@ bool RDepends(CommandLine &CmdL)
               if (V != Cache.VerP + V.ParentPkg()->VersionList ||
                   V->ParentPkg == D->Package)
                  continue;
-              cout << "    " << V.ParentPkg().Name() << endl;
+              cout << "    " << V.ParentPkg().FullName(true) << endl;
               
               if (Recurse == true)
                  Colours[D.ParentPkg()->ID]++;
@@ -685,10 +718,7 @@ bool RDepends(CommandLine &CmdL)
    
    return true;
 }
-
                                                                        /*}}}*/
-
-
 // xvcg - Generate a graph for xvcg                                    /*{{{*/
 // ---------------------------------------------------------------------
 // Code contributed from Junichi Uekawa <dancer@debian.org> on 20 June 2002.
@@ -837,7 +867,7 @@ bool XVcg(CommandLine &CmdL)
            // Only graph critical deps     
            if (D.IsCritical() == true)
            {
-              printf ("edge: { sourcename: \"%s\" targetname: \"%s\" class: 2 ",Pkg.Name(), D.TargetPkg().Name() );
+              printf ("edge: { sourcename: \"%s\" targetname: \"%s\" class: 2 ",Pkg.FullName(true).c_str(), D.TargetPkg().FullName(true).c_str() );
               
               // Colour the node for recursion
               if (Show[D.TargetPkg()->ID] <= DoneNR)
@@ -846,6 +876,7 @@ bool XVcg(CommandLine &CmdL)
                     then show the relation but do not recurse */
                  if (Hit == false && 
                      (D->Type == pkgCache::Dep::Conflicts ||
+                      D->Type == pkgCache::Dep::DpkgBreaks ||
                       D->Type == pkgCache::Dep::Obsoletes))
                  {
                     if (Show[D.TargetPkg()->ID] == None && 
@@ -867,6 +898,9 @@ bool XVcg(CommandLine &CmdL)
                  case pkgCache::Dep::Conflicts:
                    printf("label: \"conflicts\" color: lightgreen }\n");
                    break;
+                 case pkgCache::Dep::DpkgBreaks:
+                   printf("label: \"breaks\" color: lightgreen }\n");
+                   break;
                  case pkgCache::Dep::Obsoletes:
                    printf("label: \"obsoletes\" color: lightgreen }\n");
                    break;
@@ -892,20 +926,22 @@ bool XVcg(CommandLine &CmdL)
         continue;
 
       if (Show[Pkg->ID] == DoneNR)
-        printf("node: { title: \"%s\" label: \"%s\" color: orange shape: %s }\n", Pkg.Name(), Pkg.Name(),
+        printf("node: { title: \"%s\" label: \"%s\" color: orange shape: %s }\n", Pkg.FullName(true).c_str(), Pkg.FullName(true).c_str(),
                Shapes[ShapeMap[Pkg->ID]]);
       else
-       printf("node: { title: \"%s\" label: \"%s\" shape: %s }\n", Pkg.Name(), Pkg.Name(), 
+       printf("node: { title: \"%s\" label: \"%s\" shape: %s }\n", Pkg.FullName(true).c_str(), Pkg.FullName(true).c_str(),
                Shapes[ShapeMap[Pkg->ID]]);
       
    }
-   
+
+   delete[] Show;
+   delete[] Flags;
+   delete[] ShapeMap;
+
    printf("}\n");
    return true;
 }
                                                                        /*}}}*/
-
-
 // Dotty - Generate a graph for Dotty                                  /*{{{*/
 // ---------------------------------------------------------------------
 /* Dotty is the graphvis program for generating graphs. It is a fairly
@@ -1052,7 +1088,7 @@ bool Dotty(CommandLine &CmdL)
            // Only graph critical deps     
            if (D.IsCritical() == true)
            {
-              printf("\"%s\" -> \"%s\"",Pkg.Name(),D.TargetPkg().Name());
+              printf("\"%s\" -> \"%s\"",Pkg.FullName(true).c_str(),D.TargetPkg().FullName(true).c_str());
               
               // Colour the node for recursion
               if (Show[D.TargetPkg()->ID] <= DoneNR)
@@ -1106,10 +1142,10 @@ bool Dotty(CommandLine &CmdL)
       
       // Orange box for early recursion stoppage
       if (Show[Pkg->ID] == DoneNR)
-        printf("\"%s\" [color=orange,shape=%s];\n",Pkg.Name(),
+        printf("\"%s\" [color=orange,shape=%s];\n",Pkg.FullName(true).c_str(),
                Shapes[ShapeMap[Pkg->ID]]);
       else
-        printf("\"%s\" [shape=%s];\n",Pkg.Name(),
+        printf("\"%s\" [shape=%s];\n",Pkg.FullName(true).c_str(),
                Shapes[ShapeMap[Pkg->ID]]);
    }
    
@@ -1192,31 +1228,65 @@ bool DisplayRecord(pkgCache::VerIterator V)
    if (_error->PendingError() == true)
       return false;
    
-   // Read the record and then write it out again.
+   // Read the record
    unsigned char *Buffer = new unsigned char[GCache->HeaderP->MaxVerFileSize+1];
    Buffer[V.FileList()->Size] = '\n';
    if (PkgF.Seek(V.FileList()->Offset) == false ||
-       PkgF.Read(Buffer,V.FileList()->Size) == false ||
-       fwrite(Buffer,1,V.FileList()->Size+1,stdout) < (size_t)(V.FileList()->Size+1))
+       PkgF.Read(Buffer,V.FileList()->Size) == false)
    {
       delete [] Buffer;
       return false;
    }
-   
+
+   // Get a pointer to start of Description field
+   const unsigned char *DescP = (unsigned char*)strstr((char*)Buffer, "Description:");
+
+   // Write all but Description
+   if (fwrite(Buffer,1,DescP - Buffer,stdout) < (size_t)(DescP - Buffer))
+   {
+      delete [] Buffer;
+      return false;
+   }
+
+   // Show the right description
+   pkgRecords Recs(*GCache);
+   pkgCache::DescIterator Desc = V.TranslatedDescription();
+   pkgRecords::Parser &P = Recs.Lookup(Desc.FileList());
+   cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc();
+
+   // Find the first field after the description (if there is any)
+   for(DescP++;DescP != &Buffer[V.FileList()->Size];DescP++) 
+   {
+      if(*DescP == '\n' && *(DescP+1) != ' ') 
+      {
+        // write the rest of the buffer
+        const unsigned char *end=&Buffer[V.FileList()->Size];
+        if (fwrite(DescP,1,end-DescP,stdout) < (size_t)(end-DescP)) 
+        {
+           delete [] Buffer;
+           return false;
+        }
+
+        break;
+      }
+   }
+   // write a final newline (after the description)
+   cout<<endl;
    delete [] Buffer;
 
    return true;
 }
                                                                        /*}}}*/
-// Search - Perform a search                                           /*{{{*/
-// ---------------------------------------------------------------------
-/* This searches the package names and pacakge descriptions for a pattern */
-struct ExVerFile
+
+struct ExDescFile
 {
-   pkgCache::VerFile *Vf;
+   pkgCache::DescFile *Df;
    bool NameMatch;
 };
 
+// Search - Perform a search                                           /*{{{*/
+// ---------------------------------------------------------------------
+/* This searches the package names and package descriptions for a pattern */
 bool Search(CommandLine &CmdL)
 {
    pkgCache &Cache = *GCache;
@@ -1253,35 +1323,35 @@ bool Search(CommandLine &CmdL)
       return false;
    }
    
-   ExVerFile *VFList = new ExVerFile[Cache.HeaderP->PackageCount+1];
-   memset(VFList,0,sizeof(*VFList)*Cache.HeaderP->PackageCount+1);
+   ExDescFile *DFList = new ExDescFile[Cache.HeaderP->PackageCount+1];
+   memset(DFList,0,sizeof(*DFList)*Cache.HeaderP->PackageCount+1);
 
    // Map versions that we want to write out onto the VerList array.
    for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
    {
-      VFList[P->ID].NameMatch = NumPatterns != 0;
+      DFList[P->ID].NameMatch = NumPatterns != 0;
       for (unsigned I = 0; I != NumPatterns; I++)
       {
         if (regexec(&Patterns[I],P.Name(),0,0,0) == 0)
-           VFList[P->ID].NameMatch &= true;
+           DFList[P->ID].NameMatch &= true;
         else
-           VFList[P->ID].NameMatch = false;
+           DFList[P->ID].NameMatch = false;
       }
         
       // Doing names only, drop any that dont match..
-      if (NamesOnly == true && VFList[P->ID].NameMatch == false)
+      if (NamesOnly == true && DFList[P->ID].NameMatch == false)
         continue;
         
       // Find the proper version to use. 
       pkgCache::VerIterator V = Plcy.GetCandidateVer(P);
       if (V.end() == false)
-        VFList[P->ID].Vf = V.FileList();
+        DFList[P->ID].Df = V.DescriptionList().FileList();
    }
       
    // Include all the packages that provide matching names too
    for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
    {
-      if (VFList[P->ID].NameMatch == false)
+      if (DFList[P->ID].NameMatch == false)
         continue;
 
       for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; Prv++)
@@ -1289,18 +1359,18 @@ bool Search(CommandLine &CmdL)
         pkgCache::VerIterator V = Plcy.GetCandidateVer(Prv.OwnerPkg());
         if (V.end() == false)
         {
-           VFList[Prv.OwnerPkg()->ID].Vf = V.FileList();
-           VFList[Prv.OwnerPkg()->ID].NameMatch = true;
+           DFList[Prv.OwnerPkg()->ID].Df = V.DescriptionList().FileList();
+           DFList[Prv.OwnerPkg()->ID].NameMatch = true;
         }
       }
    }
-
-   LocalitySort(&VFList->Vf,Cache.HeaderP->PackageCount,sizeof(*VFList));
+   
+   LocalitySort(&DFList->Df,Cache.HeaderP->PackageCount,sizeof(*DFList));
 
    // Iterate over all the version records and check them
-   for (ExVerFile *J = VFList; J->Vf != 0; J++)
+   for (ExDescFile *J = DFList; J->Df != 0; J++)
    {
-      pkgRecords::Parser &P = Recs.Lookup(pkgCache::VerFileIterator(Cache,J->Vf));
+      pkgRecords::Parser &P = Recs.Lookup(pkgCache::DescFileIterator(Cache,J->Df));
 
       bool Match = true;
       if (J->NameMatch == false)
@@ -1331,13 +1401,36 @@ bool Search(CommandLine &CmdL)
       }
    }
    
-   delete [] VFList;
+   delete [] DFList;
    for (unsigned I = 0; I != NumPatterns; I++)
       regfree(&Patterns[I]);
    if (ferror(stdout))
        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                 /*{{{*/
 // ---------------------------------------------------------------------
@@ -1351,11 +1444,15 @@ bool ShowPackage(CommandLine &CmdL)
    
    for (const char **I = CmdL.FileList + 1; *I != 0; I++)
    {
+      // FIXME: Handle the case in which pkgname name:arch is not found
       pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
       if (Pkg.end() == true)
       {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
+        Pkg = Cache.FindPkg(*I, "any");
+        if (Pkg.end() == true) {
+               _error->Warning(_("Unable to locate package %s"),*I);
+               continue;
+        }
       }
 
       ++found;
@@ -1391,16 +1488,17 @@ bool ShowPackage(CommandLine &CmdL)
 bool ShowPkgNames(CommandLine &CmdL)
 {
    pkgCache &Cache = *GCache;
-   pkgCache::PkgIterator I = Cache.PkgBegin();
-   bool All = _config->FindB("APT::Cache::AllNames","false");
-   
+   pkgCache::GrpIterator I = Cache.GrpBegin();
+   bool const All = _config->FindB("APT::Cache::AllNames","false");
+
    if (CmdL.FileList[1] != 0)
    {
       for (;I.end() != true; I++)
       {
-        if (All == false && I->VersionList == 0)
+        if (All == false && I->FirstPackage == 0)
+           continue;
+        if (I.FindPkg("any")->VersionList == 0)
            continue;
-        
         if (strncmp(I.Name(),CmdL.FileList[1],strlen(CmdL.FileList[1])) == 0)
            cout << I.Name() << endl;
       }
@@ -1411,7 +1509,9 @@ bool ShowPkgNames(CommandLine &CmdL)
    // Show all pkgs
    for (;I.end() != true; I++)
    {
-      if (All == false && I->VersionList == 0)
+      if (All == false && I->FirstPackage == 0)
+        continue;
+      if (I.FindPkg("any")->VersionList == 0)
         continue;
       cout << I.Name() << endl;
    }
@@ -1432,15 +1532,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                   /*{{{*/
@@ -1453,13 +1564,13 @@ bool Policy(CommandLine &CmdL)
    
    pkgCache &Cache = *GCache;
    pkgPolicy Plcy(&Cache);
-   if (ReadPinFile(Plcy) == false)
+   if (ReadPinFile(Plcy) == false || ReadPinDir(Plcy) == false)
       return false;
    
    // Print out all of the package files
    if (CmdL.FileList[1] == 0)
    {
-      cout << _("Package Files:") << endl;   
+      cout << _("Package files:") << endl;   
       for (pkgCache::PkgFileIterator F = Cache.FileBegin(); F.end() == false; F++)
       {
         // Locate the associated index files so we can derive a description
@@ -1467,7 +1578,8 @@ bool Policy(CommandLine &CmdL)
         if (SrcList->FindIndex(F,Indx) == false &&
             _system->FindIndex(F,Indx) == false)
            return _error->Error(_("Cache is out of sync, can't x-ref a package file"));
-        printf(_("%4i %s\n"),
+        
+        printf("%4i %s\n",
                Plcy.GetPriority(F),Indx->Describe(true).c_str());
         
         // Print the reference information for the package
@@ -1479,7 +1591,7 @@ bool Policy(CommandLine &CmdL)
       }
       
       // Show any packages have explicit pins
-      cout << _("Pinned Packages:") << endl;
+      cout << _("Pinned packages:") << endl;
       pkgCache::PkgIterator I = Cache.PkgBegin();
       for (;I.end() != true; I++)
       {
@@ -1487,7 +1599,7 @@ bool Policy(CommandLine &CmdL)
            continue;
 
         // Print the package name and the version we are forcing to
-        cout << "     " << I.Name() << " -> ";
+        cout << "     " << I.FullName(true) << " -> ";
         
         pkgCache::VerIterator V = Plcy.GetMatch(I);
         if (V.end() == true)
@@ -1498,28 +1610,43 @@ bool Policy(CommandLine &CmdL)
       
       return true;
    }
-   
+
+   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++)
    {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*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;
       }
-      
-      cout << Pkg.Name() << ":" << endl;
-      
+
+      for (; Pkg.end() != true; Pkg = Grp.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;
@@ -1529,7 +1656,7 @@ bool Policy(CommandLine &CmdL)
       // Pinned version
       if (Plcy.GetPriority(Pkg) != 0)
       {
-        cout << _("  Package Pin: ");
+        cout << _("  Package pin: ");
         V = Plcy.GetMatch(Pkg);
         if (V.end() == true)
            cout << _("(not found)") << endl;
@@ -1538,7 +1665,7 @@ bool Policy(CommandLine &CmdL)
       }
       
       // Show the priority tables
-      cout << _("  Version Table:") << endl;
+      cout << _("  Version table:") << endl;
       for (V = Pkg.VersionList(); V.end() == false; V++)
       {
         if (Pkg.CurrentVer() == V)
@@ -1553,10 +1680,11 @@ bool Policy(CommandLine &CmdL)
            if (SrcList->FindIndex(VF.File(),Indx) == false &&
                _system->FindIndex(VF.File(),Indx) == false)
               return _error->Error(_("Cache is out of sync, can't x-ref a package file"));
-           printf(_("       %4i %s\n"),Plcy.GetPriority(VF.File()),
+           printf("       %4i %s\n",Plcy.GetPriority(VF.File()),
                   Indx->Describe(true).c_str());
-        }       
-      }      
+        }
+      }
+      }
    }
    
    return true;
@@ -1574,10 +1702,11 @@ bool Madison(CommandLine &CmdL)
 
    pkgCache &Cache = *GCache;
 
-   // Create the text record parsers
+   // Create the src text record parsers and ignore errors about missing
+   // deb-src lines that are generated from pkgSrcRecords::pkgSrcRecords
    pkgSrcRecords SrcRecs(*SrcList);
    if (_error->PendingError() == true)
-      return false;
+      _error->Discard();
 
    for (const char **I = CmdL.FileList + 1; *I != 0; I++)
    {
@@ -1605,7 +1734,7 @@ bool Madison(CommandLine &CmdL)
                     {
                          if ((*IF)->FindInCache(*(VF.File().Cache())) == VF.File())
                          {
-                                   cout << setw(10) << Pkg.Name() << " | " << setw(10) << V.VerStr() << " | "
+                                   cout << setw(10) << Pkg.FullName(true) << " | " << setw(10) << V.VerStr() << " | "
                                         << (*IF)->Describe(true) << endl;
                          }
                     }
@@ -1628,7 +1757,6 @@ bool Madison(CommandLine &CmdL)
 
    return true;
 }
-
                                                                        /*}}}*/
 // GenCaches - Call the main cache generator                           /*{{{*/
 // ---------------------------------------------------------------------
@@ -1648,8 +1776,8 @@ bool GenCaches(CommandLine &Cmd)
 /* */
 bool ShowHelp(CommandLine &Cmd)
 {
-   ioprintf(cout,_("%s %s for %s %s compiled on %s %s\n"),PACKAGE,VERSION,
-           COMMON_OS,COMMON_CPU,__DATE__,__TIME__);
+   ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,VERSION,
+           COMMON_ARCH,__DATE__,__TIME__);
    
    if (_config->FindB("version") == true)
      return true;
@@ -1674,10 +1802,11 @@ 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\n"
-      "   dotty - Generate package graphs for GraphVis\n"
+      "   pkgnames - List the names of all packages in the system\n"
+      "   dotty - Generate package graphs for GraphViz\n"
       "   xvcg - Generate package graphs for xvcg\n"
       "   policy - Show policy settings\n"
       "\n"
@@ -1702,8 +1831,7 @@ void CacheInitialize()
    _config->Set("help",false);
 }
                                                                        /*}}}*/
-
-int main(int argc,const char *argv[])
+int main(int argc,const char *argv[])                                  /*{{{*/
 {
    CommandLine::Args Args[] = {
       {'h',"help","help",0},
@@ -1739,6 +1867,7 @@ int main(int argc,const char *argv[])
                                     {"xvcg",&XVcg},
                                     {"show",&ShowPackage},
                                     {"pkgnames",&ShowPkgNames},
+                                    {"showauto",&ShowAuto},
                                     {"policy",&Policy},
                                     {"madison",&Madison},
                                     {0,0}};
@@ -1810,3 +1939,4 @@ int main(int argc,const char *argv[])
           
    return 0;
 }
+                                                                       /*}}}*/