Просмотр исходного кода

use pkgCacheFile and the new CacheSets all over the place

David Kalnischkies лет назад: 16
Родитель
Сommit
d9eb210edd
2 измененных файлов с 195 добавлено и 205 удалено
  1. 194 205
      cmdline/apt-cache.cc
  2. 1 0
      debian/changelog

+ 194 - 205
cmdline/apt-cache.cc

@@ -46,9 +46,6 @@
 
 
 using namespace std;
 using namespace std;
 
 
-pkgCache *GCache = 0;
-pkgSourceList *SrcList = 0;
-
 // LocalitySort - Sort a version list by package file locality		/*{{{*/
 // LocalitySort - Sort a version list by package file locality		/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
@@ -86,10 +83,13 @@ void LocalitySort(pkgCache::DescFile **begin,
 /* */
 /* */
 bool UnMet(CommandLine &CmdL)
 bool UnMet(CommandLine &CmdL)
 {
 {
-   pkgCache &Cache = *GCache;
-   bool Important = _config->FindB("APT::Cache::Important",false);
-   
-   for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
+   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++)
       for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
       {
       {
@@ -174,9 +174,9 @@ bool UnMet(CommandLine &CmdL)
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
 bool DumpPackage(CommandLine &CmdL)
 bool DumpPackage(CommandLine &CmdL)
-{   
-   pkgCache &Cache = *GCache;
-   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+{
+   pkgCacheFile CacheFile;
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList);
 
 
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
    {
@@ -239,18 +239,22 @@ bool DumpPackage(CommandLine &CmdL)
 /* */
 /* */
 bool Stats(CommandLine &Cmd)
 bool Stats(CommandLine &Cmd)
 {
 {
-   pkgCache &Cache = *GCache;
-   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;
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL))
+      return false;
+
+   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;
    int Normal = 0;
    int Virtual = 0;
    int Virtual = 0;
    int NVirt = 0;
    int NVirt = 0;
    int DVirt = 0;
    int DVirt = 0;
    int Missing = 0;
    int Missing = 0;
-   pkgCache::PkgIterator I = Cache.PkgBegin();
+   pkgCache::PkgIterator I = Cache->PkgBegin();
    for (;I.end() != true; I++)
    for (;I.end() != true; I++)
    {
    {
       if (I->VersionList != 0 && I->ProvidesList == 0)
       if (I->VersionList != 0 && I->ProvidesList == 0)
@@ -288,33 +292,33 @@ bool Stats(CommandLine &Cmd)
    cout << _("  Mixed virtual packages: ") << NVirt << endl;
    cout << _("  Mixed virtual packages: ") << NVirt << endl;
    cout << _("  Missing: ") << Missing << endl;
    cout << _("  Missing: ") << Missing << endl;
    
    
-   cout << _("Total distinct versions: ") << Cache.Head().VersionCount << " (" <<
-      SizeToStr(Cache.Head().VersionCount*Cache.Head().VersionSz) << ')' << endl;
-   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 distinct versions: ") << Cache->Head().VersionCount << " (" <<
+      SizeToStr(Cache->Head().VersionCount*Cache->Head().VersionSz) << ')' << endl;
+   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 << " (" <<
-      SizeToStr(Cache.Head().VerFileCount*Cache.Head().VerFileSz) << ')' << endl;
-   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;
+   cout << _("Total ver/file relations: ") << Cache->Head().VerFileCount << " (" <<
+      SizeToStr(Cache->Head().VerFileCount*Cache->Head().VerFileSz) << ')' << endl;
+   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
    // String list stats
    unsigned long Size = 0;
    unsigned long Size = 0;
    unsigned long Count = 0;
    unsigned long Count = 0;
-   for (pkgCache::StringItem *I = Cache.StringItemP + Cache.Head().StringList;
-        I!= Cache.StringItemP; I = Cache.StringItemP + I->NextItem)
+   for (pkgCache::StringItem *I = Cache->StringItemP + Cache->Head().StringList;
+        I!= Cache->StringItemP; I = Cache->StringItemP + I->NextItem)
    {
    {
       Count++;
       Count++;
-      Size += strlen(Cache.StrP + I->String) + 1;
+      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;
    unsigned long DepVerSize = 0;
-   for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
+   for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
    {
    {
       for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
       for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
       {
       {
@@ -329,15 +333,15 @@ bool Stats(CommandLine &Cmd)
    
    
    unsigned long Slack = 0;
    unsigned long Slack = 0;
    for (int I = 0; I != 7; I++)
    for (int I = 0; I != 7; I++)
-      Slack += Cache.Head().Pools[I].ItemSize*Cache.Head().Pools[I].Count;
+      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;
    unsigned long Total = 0;
-   Total = Slack + Size + Cache.Head().DependsCount*Cache.Head().DependencySz + 
-           Cache.Head().VersionCount*Cache.Head().VersionSz +
-           Cache.Head().PackageCount*Cache.Head().PackageSz + 
-           Cache.Head().VerFileCount*Cache.Head().VerFileSz +
-           Cache.Head().ProvidesCount*Cache.Head().ProvidesSz;
+   Total = Slack + Size + Cache->Head().DependsCount*Cache->Head().DependencySz + 
+           Cache->Head().VersionCount*Cache->Head().VersionSz +
+           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;
    return true;
@@ -348,10 +352,14 @@ bool Stats(CommandLine &Cmd)
 /* This is worthless except fer debugging things */
 /* This is worthless except fer debugging things */
 bool Dump(CommandLine &Cmd)
 bool Dump(CommandLine &Cmd)
 {
 {
-   pkgCache &Cache = *GCache;
-   cout << "Using Versioning System: " << Cache.VS->Label << endl;
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL))
+      return false;
+
+   cout << "Using Versioning System: " << Cache->VS->Label << endl;
    
    
-   for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
+   for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
    {
    {
       cout << "Package: " << P.FullName(true) << endl;
       cout << "Package: " << P.FullName(true) << endl;
       for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
       for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
@@ -370,7 +378,7 @@ bool Dump(CommandLine &Cmd)
       }      
       }      
    }
    }
 
 
-   for (pkgCache::PkgFileIterator F = Cache.FileBegin(); F.end() == false; F++)
+   for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F.end() == false; F++)
    {
    {
       cout << "File: " << F.FileName() << endl;
       cout << "File: " << F.FileName() << endl;
       cout << " Type: " << F.IndexType() << endl;
       cout << " Type: " << F.IndexType() << endl;
@@ -396,18 +404,17 @@ bool Dump(CommandLine &Cmd)
    make this run really fast, perhaps I went a little overboard.. */
    make this run really fast, perhaps I went a little overboard.. */
 bool DumpAvail(CommandLine &Cmd)
 bool DumpAvail(CommandLine &Cmd)
 {
 {
-   pkgCache &Cache = *GCache;
-
-   pkgPolicy Plcy(&Cache);
-   if (ReadPinFile(Plcy) == false || ReadPinDir(Plcy) == false)
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL || CacheFile.BuildPolicy() == false))
       return false;
       return false;
-   
-   unsigned long Count = Cache.HeaderP->PackageCount+1;
+
+   unsigned long Count = Cache->HeaderP->PackageCount+1;
    pkgCache::VerFile **VFList = new pkgCache::VerFile *[Count];
    pkgCache::VerFile **VFList = new pkgCache::VerFile *[Count];
    memset(VFList,0,sizeof(*VFList)*Count);
    memset(VFList,0,sizeof(*VFList)*Count);
    
    
    // Map versions that we want to write out onto the VerList array.
    // Map versions that we want to write out onto the VerList array.
-   for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
+   for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
    {    
    {    
       if (P->VersionList == 0)
       if (P->VersionList == 0)
 	 continue;
 	 continue;
@@ -415,7 +422,7 @@ bool DumpAvail(CommandLine &Cmd)
       /* Find the proper version to use. If the policy says there are no
       /* Find the proper version to use. If the policy says there are no
          possible selections we return the installed version, if available..
          possible selections we return the installed version, if available..
        	 This prevents dselect from making it obsolete. */
        	 This prevents dselect from making it obsolete. */
-      pkgCache::VerIterator V = Plcy.GetCandidateVer(P);
+      pkgCache::VerIterator V = CacheFile.GetPolicy()->GetCandidateVer(P);
       if (V.end() == true)
       if (V.end() == true)
       {
       {
 	 if (P->CurrentVer == 0)
 	 if (P->CurrentVer == 0)
@@ -460,10 +467,10 @@ bool DumpAvail(CommandLine &Cmd)
    LocalitySort(VFList,Count,sizeof(*VFList));
    LocalitySort(VFList,Count,sizeof(*VFList));
 
 
    // Iterate over all the package files and write them out.
    // Iterate over all the package files and write them out.
-   char *Buffer = new char[Cache.HeaderP->MaxVerFileSize+10];
+   char *Buffer = new char[Cache->HeaderP->MaxVerFileSize+10];
    for (pkgCache::VerFile **J = VFList; *J != 0;)
    for (pkgCache::VerFile **J = VFList; *J != 0;)
    {
    {
-      pkgCache::PkgFileIterator File(Cache,(*J)->File + Cache.PkgFileP);
+      pkgCache::PkgFileIterator File(*Cache,(*J)->File + Cache->PkgFileP);
       if (File.IsOk() == false)
       if (File.IsOk() == false)
       {
       {
 	 _error->Error(_("Package file %s is out of sync."),File.FileName());
 	 _error->Error(_("Package file %s is out of sync."),File.FileName());
@@ -482,7 +489,7 @@ bool DumpAvail(CommandLine &Cmd)
       unsigned long Pos = 0;
       unsigned long Pos = 0;
       for (; *J != 0; J++)
       for (; *J != 0; J++)
       {
       {
-	 if ((*J)->File + Cache.PkgFileP != File)
+	 if ((*J)->File + Cache->PkgFileP != File)
 	    break;
 	    break;
 	 
 	 
 	 const pkgCache::VerFile &VF = **J;
 	 const pkgCache::VerFile &VF = **J;
@@ -538,11 +545,15 @@ bool DumpAvail(CommandLine &Cmd)
 /* */
 /* */
 bool Depends(CommandLine &CmdL)
 bool Depends(CommandLine &CmdL)
 {
 {
-   pkgCache &Cache = *GCache;
-   SPtrArray<unsigned> Colours = new unsigned[Cache.Head().PackageCount];
-   memset(Colours,0,sizeof(*Colours)*Cache.Head().PackageCount);
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL))
+      return false;
 
 
-   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   SPtrArray<unsigned> Colours = new unsigned[Cache->Head().PackageCount];
+   memset(Colours,0,sizeof(*Colours)*Cache->Head().PackageCount);
+
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList);
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
       Colours[Pkg->ID] = 1;
       Colours[Pkg->ID] = 1;
 
 
@@ -553,7 +564,7 @@ bool Depends(CommandLine &CmdL)
    do
    do
    {
    {
       DidSomething = false;
       DidSomething = false;
-      for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+      for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
       {
       {
 	 if (Colours[Pkg->ID] != 1)
 	 if (Colours[Pkg->ID] != 1)
 	    continue;
 	    continue;
@@ -600,11 +611,11 @@ bool Depends(CommandLine &CmdL)
 	    
 	    
 	    // Display all solutions
 	    // Display all solutions
 	    SPtrArray<pkgCache::Version *> List = D.AllTargets();
 	    SPtrArray<pkgCache::Version *> List = D.AllTargets();
-	    pkgPrioSortList(Cache,List);
+	    pkgPrioSortList(*Cache,List);
 	    for (pkgCache::Version **I = List; *I != 0; I++)
 	    for (pkgCache::Version **I = List; *I != 0; I++)
 	    {
 	    {
-	       pkgCache::VerIterator V(Cache,*I);
-	       if (V != Cache.VerP + V.ParentPkg()->VersionList ||
+	       pkgCache::VerIterator V(*Cache,*I);
+	       if (V != Cache->VerP + V.ParentPkg()->VersionList ||
 		   V->ParentPkg == D->Package)
 		   V->ParentPkg == D->Package)
 		  continue;
 		  continue;
 	       cout << "    " << V.ParentPkg().FullName(true) << endl;
 	       cout << "    " << V.ParentPkg().FullName(true) << endl;
@@ -625,11 +636,15 @@ bool Depends(CommandLine &CmdL)
 /* */
 /* */
 bool RDepends(CommandLine &CmdL)
 bool RDepends(CommandLine &CmdL)
 {
 {
-   pkgCache &Cache = *GCache;
-   SPtrArray<unsigned> Colours = new unsigned[Cache.Head().PackageCount];
-   memset(Colours,0,sizeof(*Colours)*Cache.Head().PackageCount);
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL))
+      return false;
 
 
-   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   SPtrArray<unsigned> Colours = new unsigned[Cache->Head().PackageCount];
+   memset(Colours,0,sizeof(*Colours)*Cache->Head().PackageCount);
+
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList);
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
       Colours[Pkg->ID] = 1;
       Colours[Pkg->ID] = 1;
 
 
@@ -639,7 +654,7 @@ bool RDepends(CommandLine &CmdL)
    do
    do
    {
    {
       DidSomething = false;
       DidSomething = false;
-      for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+      for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
       {
       {
 	 if (Colours[Pkg->ID] != 1)
 	 if (Colours[Pkg->ID] != 1)
 	    continue;
 	    continue;
@@ -681,11 +696,11 @@ bool RDepends(CommandLine &CmdL)
 	    
 	    
 	    // Display all solutions
 	    // Display all solutions
 	    SPtrArray<pkgCache::Version *> List = D.AllTargets();
 	    SPtrArray<pkgCache::Version *> List = D.AllTargets();
-	    pkgPrioSortList(Cache,List);
+	    pkgPrioSortList(*Cache,List);
 	    for (pkgCache::Version **I = List; *I != 0; I++)
 	    for (pkgCache::Version **I = List; *I != 0; I++)
 	    {
 	    {
-	       pkgCache::VerIterator V(Cache,*I);
-	       if (V != Cache.VerP + V.ParentPkg()->VersionList ||
+	       pkgCache::VerIterator V(*Cache,*I);
+	       if (V != Cache->VerP + V.ParentPkg()->VersionList ||
 		   V->ParentPkg == D->Package)
 		   V->ParentPkg == D->Package)
 		  continue;
 		  continue;
 	       cout << "    " << V.ParentPkg().FullName(true) << endl;
 	       cout << "    " << V.ParentPkg().FullName(true) << endl;
@@ -707,7 +722,11 @@ bool RDepends(CommandLine &CmdL)
 
 
 bool XVcg(CommandLine &CmdL)
 bool XVcg(CommandLine &CmdL)
 {
 {
-   pkgCache &Cache = *GCache;
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL))
+      return false;
+
    bool GivenOnly = _config->FindB("APT::Cache::GivenOnly",false);
    bool GivenOnly = _config->FindB("APT::Cache::GivenOnly",false);
    
    
    /* Normal packages are boxes
    /* Normal packages are boxes
@@ -724,21 +743,21 @@ bool XVcg(CommandLine &CmdL)
       0 = None */
       0 = None */
    enum States {None=0, ToShow, ToShowNR, DoneNR, Done};
    enum States {None=0, ToShow, ToShowNR, DoneNR, Done};
    enum TheFlags {ForceNR=(1<<0)};
    enum TheFlags {ForceNR=(1<<0)};
-   unsigned char *Show = new unsigned char[Cache.Head().PackageCount];
-   unsigned char *Flags = new unsigned char[Cache.Head().PackageCount];
-   unsigned char *ShapeMap = new unsigned char[Cache.Head().PackageCount];
+   unsigned char *Show = new unsigned char[Cache->Head().PackageCount];
+   unsigned char *Flags = new unsigned char[Cache->Head().PackageCount];
+   unsigned char *ShapeMap = new unsigned char[Cache->Head().PackageCount];
    
    
    // Show everything if no arguments given
    // Show everything if no arguments given
    if (CmdL.FileList[1] == 0)
    if (CmdL.FileList[1] == 0)
-      for (unsigned long I = 0; I != Cache.Head().PackageCount; I++)
+      for (unsigned long I = 0; I != Cache->Head().PackageCount; I++)
 	 Show[I] = ToShow;
 	 Show[I] = ToShow;
    else
    else
-      for (unsigned long I = 0; I != Cache.Head().PackageCount; I++)
+      for (unsigned long I = 0; I != Cache->Head().PackageCount; I++)
 	 Show[I] = None;
 	 Show[I] = None;
-   memset(Flags,0,sizeof(*Flags)*Cache.Head().PackageCount);
+   memset(Flags,0,sizeof(*Flags)*Cache->Head().PackageCount);
    
    
    // Map the shapes
    // Map the shapes
-   for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+   for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
    {   
    {   
       if (Pkg->VersionList == 0)
       if (Pkg->VersionList == 0)
       {
       {
@@ -777,7 +796,7 @@ bool XVcg(CommandLine &CmdL)
       }
       }
       
       
       // Locate the package
       // Locate the package
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(P);
+      pkgCache::PkgIterator Pkg = Cache->FindPkg(P);
       if (Pkg.end() == true)
       if (Pkg.end() == true)
       {
       {
 	 _error->Warning(_("Unable to locate package %s"),*I);
 	 _error->Warning(_("Unable to locate package %s"),*I);
@@ -798,7 +817,7 @@ bool XVcg(CommandLine &CmdL)
    while (Act == true)
    while (Act == true)
    {
    {
       Act = false;
       Act = false;
-      for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+      for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
       {
       {
 	 // See we need to show this package
 	 // See we need to show this package
 	 if (Show[Pkg->ID] == None || Show[Pkg->ID] >= DoneNR)
 	 if (Show[Pkg->ID] == None || Show[Pkg->ID] >= DoneNR)
@@ -833,7 +852,7 @@ bool XVcg(CommandLine &CmdL)
 	    for (pkgCache::VerIterator I = DPkg.VersionList();
 	    for (pkgCache::VerIterator I = DPkg.VersionList();
 		      I.end() == false && Hit == false; I++)
 		      I.end() == false && Hit == false; I++)
 	    {
 	    {
-	       if (Cache.VS->CheckDep(I.VerStr(),D->CompareOp,D.TargetVer()) == true)
+	       if (Cache->VS->CheckDep(I.VerStr(),D->CompareOp,D.TargetVer()) == true)
 		  Hit = true;
 		  Hit = true;
 	    }
 	    }
 	    
 	    
@@ -841,7 +860,7 @@ bool XVcg(CommandLine &CmdL)
 	    for (pkgCache::PrvIterator I = DPkg.ProvidesList(); 
 	    for (pkgCache::PrvIterator I = DPkg.ProvidesList(); 
 		      I.end() == false && Hit == false; I++)
 		      I.end() == false && Hit == false; I++)
 	    {
 	    {
-	       if (Cache.VS->CheckDep(I.ProvideVersion(),D->CompareOp,D.TargetVer()) == false)
+	       if (Cache->VS->CheckDep(I.ProvideVersion(),D->CompareOp,D.TargetVer()) == false)
 		  Hit = true;
 		  Hit = true;
 	    }
 	    }
 	    
 	    
@@ -902,7 +921,7 @@ bool XVcg(CommandLine &CmdL)
    
    
    /* Draw the box colours after the fact since we can not tell what colour
    /* Draw the box colours after the fact since we can not tell what colour
       they should be until everything is finished drawing */
       they should be until everything is finished drawing */
-   for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+   for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
    {
    {
       if (Show[Pkg->ID] < DoneNR)
       if (Show[Pkg->ID] < DoneNR)
 	 continue;
 	 continue;
@@ -931,7 +950,11 @@ bool XVcg(CommandLine &CmdL)
    http://www.research.att.com/sw/tools/graphviz/ */
    http://www.research.att.com/sw/tools/graphviz/ */
 bool Dotty(CommandLine &CmdL)
 bool Dotty(CommandLine &CmdL)
 {
 {
-   pkgCache &Cache = *GCache;
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL))
+      return false;
+
    bool GivenOnly = _config->FindB("APT::Cache::GivenOnly",false);
    bool GivenOnly = _config->FindB("APT::Cache::GivenOnly",false);
    
    
    /* Normal packages are boxes
    /* Normal packages are boxes
@@ -948,21 +971,21 @@ bool Dotty(CommandLine &CmdL)
       0 = None */
       0 = None */
    enum States {None=0, ToShow, ToShowNR, DoneNR, Done};
    enum States {None=0, ToShow, ToShowNR, DoneNR, Done};
    enum TheFlags {ForceNR=(1<<0)};
    enum TheFlags {ForceNR=(1<<0)};
-   unsigned char *Show = new unsigned char[Cache.Head().PackageCount];
-   unsigned char *Flags = new unsigned char[Cache.Head().PackageCount];
-   unsigned char *ShapeMap = new unsigned char[Cache.Head().PackageCount];
+   unsigned char *Show = new unsigned char[Cache->Head().PackageCount];
+   unsigned char *Flags = new unsigned char[Cache->Head().PackageCount];
+   unsigned char *ShapeMap = new unsigned char[Cache->Head().PackageCount];
    
    
    // Show everything if no arguments given
    // Show everything if no arguments given
    if (CmdL.FileList[1] == 0)
    if (CmdL.FileList[1] == 0)
-      for (unsigned long I = 0; I != Cache.Head().PackageCount; I++)
+      for (unsigned long I = 0; I != Cache->Head().PackageCount; I++)
 	 Show[I] = ToShow;
 	 Show[I] = ToShow;
    else
    else
-      for (unsigned long I = 0; I != Cache.Head().PackageCount; I++)
+      for (unsigned long I = 0; I != Cache->Head().PackageCount; I++)
 	 Show[I] = None;
 	 Show[I] = None;
-   memset(Flags,0,sizeof(*Flags)*Cache.Head().PackageCount);
+   memset(Flags,0,sizeof(*Flags)*Cache->Head().PackageCount);
    
    
    // Map the shapes
    // Map the shapes
-   for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+   for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
    {   
    {   
       if (Pkg->VersionList == 0)
       if (Pkg->VersionList == 0)
       {
       {
@@ -1001,7 +1024,7 @@ bool Dotty(CommandLine &CmdL)
       }
       }
       
       
       // Locate the package
       // Locate the package
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(P);
+      pkgCache::PkgIterator Pkg = Cache->FindPkg(P);
       if (Pkg.end() == true)
       if (Pkg.end() == true)
       {
       {
 	 _error->Warning(_("Unable to locate package %s"),*I);
 	 _error->Warning(_("Unable to locate package %s"),*I);
@@ -1022,7 +1045,7 @@ bool Dotty(CommandLine &CmdL)
    while (Act == true)
    while (Act == true)
    {
    {
       Act = false;
       Act = false;
-      for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+      for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
       {
       {
 	 // See we need to show this package
 	 // See we need to show this package
 	 if (Show[Pkg->ID] == None || Show[Pkg->ID] >= DoneNR)
 	 if (Show[Pkg->ID] == None || Show[Pkg->ID] >= DoneNR)
@@ -1055,7 +1078,7 @@ bool Dotty(CommandLine &CmdL)
 	    for (pkgCache::VerIterator I = DPkg.VersionList();
 	    for (pkgCache::VerIterator I = DPkg.VersionList();
 		      I.end() == false && Hit == false; I++)
 		      I.end() == false && Hit == false; I++)
 	    {
 	    {
-	       if (Cache.VS->CheckDep(I.VerStr(),D->CompareOp,D.TargetVer()) == true)
+	       if (Cache->VS->CheckDep(I.VerStr(),D->CompareOp,D.TargetVer()) == true)
 		  Hit = true;
 		  Hit = true;
 	    }
 	    }
 	    
 	    
@@ -1063,7 +1086,7 @@ bool Dotty(CommandLine &CmdL)
 	    for (pkgCache::PrvIterator I = DPkg.ProvidesList(); 
 	    for (pkgCache::PrvIterator I = DPkg.ProvidesList(); 
 		      I.end() == false && Hit == false; I++)
 		      I.end() == false && Hit == false; I++)
 	    {
 	    {
-	       if (Cache.VS->CheckDep(I.ProvideVersion(),D->CompareOp,D.TargetVer()) == false)
+	       if (Cache->VS->CheckDep(I.ProvideVersion(),D->CompareOp,D.TargetVer()) == false)
 		  Hit = true;
 		  Hit = true;
 	    }
 	    }
 	    
 	    
@@ -1117,7 +1140,7 @@ bool Dotty(CommandLine &CmdL)
    
    
    /* Draw the box colours after the fact since we can not tell what colour
    /* Draw the box colours after the fact since we can not tell what colour
       they should be until everything is finished drawing */
       they should be until everything is finished drawing */
-   for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; Pkg++)
+   for (pkgCache::PkgIterator Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
    {
    {
       if (Show[Pkg->ID] < DoneNR)
       if (Show[Pkg->ID] < DoneNR)
 	 continue;
 	 continue;
@@ -1191,8 +1214,12 @@ bool DoAdd(CommandLine &CmdL)
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This displays the package record from the proper package index file. 
 /* This displays the package record from the proper package index file. 
    It is not used by DumpAvail for performance reasons. */
    It is not used by DumpAvail for performance reasons. */
-bool DisplayRecord(pkgCache::VerIterator V)
+bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V)
 {
 {
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == NULL))
+      return false;
+
    // Find an appropriate file
    // Find an appropriate file
    pkgCache::VerFileIterator Vf = V.FileList();
    pkgCache::VerFileIterator Vf = V.FileList();
    for (; Vf.end() == false; Vf++)
    for (; Vf.end() == false; Vf++)
@@ -1211,7 +1238,7 @@ bool DisplayRecord(pkgCache::VerIterator V)
       return false;
       return false;
    
    
    // Read the record
    // Read the record
-   unsigned char *Buffer = new unsigned char[GCache->HeaderP->MaxVerFileSize+1];
+   unsigned char *Buffer = new unsigned char[Cache->HeaderP->MaxVerFileSize+1];
    Buffer[V.FileList()->Size] = '\n';
    Buffer[V.FileList()->Size] = '\n';
    if (PkgF.Seek(V.FileList()->Offset) == false ||
    if (PkgF.Seek(V.FileList()->Offset) == false ||
        PkgF.Read(Buffer,V.FileList()->Size) == false)
        PkgF.Read(Buffer,V.FileList()->Size) == false)
@@ -1231,7 +1258,7 @@ bool DisplayRecord(pkgCache::VerIterator V)
    }
    }
 
 
    // Show the right description
    // Show the right description
-   pkgRecords Recs(*GCache);
+   pkgRecords Recs(*Cache);
    pkgCache::DescIterator Desc = V.TranslatedDescription();
    pkgCache::DescIterator Desc = V.TranslatedDescription();
    pkgRecords::Parser &P = Recs.Lookup(Desc.FileList());
    pkgRecords::Parser &P = Recs.Lookup(Desc.FileList());
    cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc();
    cout << "Description" << ( (strcmp(Desc.LanguageCode(),"") != 0) ? "-" : "" ) << Desc.LanguageCode() << ": " << P.LongDesc();
@@ -1271,13 +1298,16 @@ struct ExDescFile
 /* This searches the package names and package descriptions for a pattern */
 /* This searches the package names and package descriptions for a pattern */
 bool Search(CommandLine &CmdL)
 bool Search(CommandLine &CmdL)
 {
 {
-   pkgCache &Cache = *GCache;
    bool const ShowFull = _config->FindB("APT::Cache::ShowFull",false);
    bool const ShowFull = _config->FindB("APT::Cache::ShowFull",false);
    bool const NamesOnly = _config->FindB("APT::Cache::NamesOnly",false);
    bool const NamesOnly = _config->FindB("APT::Cache::NamesOnly",false);
    unsigned int const NumPatterns = CmdL.FileSize() -1;
    unsigned int const NumPatterns = CmdL.FileSize() -1;
    
    
-   pkgDepCache::Policy Plcy;
-   
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   pkgDepCache::Policy *Plcy = CacheFile.GetPolicy();
+   if (unlikely(Cache == NULL || Plcy == NULL))
+      return false;
+
    // Make sure there is at least one argument
    // Make sure there is at least one argument
    if (NumPatterns < 1)
    if (NumPatterns < 1)
       return _error->Error(_("You must give at least one search pattern"));
       return _error->Error(_("You must give at least one search pattern"));
@@ -1303,11 +1333,11 @@ bool Search(CommandLine &CmdL)
       return false;
       return false;
    }
    }
    
    
-   ExDescFile *DFList = new ExDescFile[Cache.HeaderP->GroupCount+1];
-   memset(DFList,0,sizeof(*DFList)*Cache.HeaderP->GroupCount+1);
+   ExDescFile *DFList = new ExDescFile[Cache->HeaderP->GroupCount+1];
+   memset(DFList,0,sizeof(*DFList)*Cache->HeaderP->GroupCount+1);
 
 
    // Map versions that we want to write out onto the VerList array.
    // Map versions that we want to write out onto the VerList array.
-   for (pkgCache::GrpIterator G = Cache.GrpBegin(); G.end() == false; ++G)
+   for (pkgCache::GrpIterator G = Cache->GrpBegin(); G.end() == false; ++G)
    {
    {
       if (DFList[G->ID].NameMatch == true)
       if (DFList[G->ID].NameMatch == true)
 	 continue;
 	 continue;
@@ -1329,7 +1359,7 @@ bool Search(CommandLine &CmdL)
       pkgCache::PkgIterator P = G.FindPreferredPkg();
       pkgCache::PkgIterator P = G.FindPreferredPkg();
       if (P.end() == true)
       if (P.end() == true)
 	 continue;
 	 continue;
-      pkgCache::VerIterator V = Plcy.GetCandidateVer(P);
+      pkgCache::VerIterator V = Plcy->GetCandidateVer(P);
       if (V.end() == false)
       if (V.end() == false)
 	 DFList[G->ID].Df = V.DescriptionList().FileList();
 	 DFList[G->ID].Df = V.DescriptionList().FileList();
 
 
@@ -1339,7 +1369,7 @@ bool Search(CommandLine &CmdL)
       // Include all the packages that provide matching names too
       // Include all the packages that provide matching names too
       for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; Prv++)
       for (pkgCache::PrvIterator Prv = P.ProvidesList() ; Prv.end() == false; Prv++)
       {
       {
-	 pkgCache::VerIterator V = Plcy.GetCandidateVer(Prv.OwnerPkg());
+	 pkgCache::VerIterator V = Plcy->GetCandidateVer(Prv.OwnerPkg());
 	 if (V.end() == true)
 	 if (V.end() == true)
 	    continue;
 	    continue;
 
 
@@ -1349,14 +1379,14 @@ bool Search(CommandLine &CmdL)
       }
       }
    }
    }
    
    
-   LocalitySort(&DFList->Df,Cache.HeaderP->GroupCount,sizeof(*DFList));
+   LocalitySort(&DFList->Df,Cache->HeaderP->GroupCount,sizeof(*DFList));
 
 
    // Create the text record parser
    // Create the text record parser
-   pkgRecords Recs(Cache);
+   pkgRecords Recs(*Cache);
    // Iterate over all the version records and check them
    // Iterate over all the version records and check them
    for (ExDescFile *J = DFList; J->Df != 0; J++)
    for (ExDescFile *J = DFList; J->Df != 0; J++)
    {
    {
-      pkgRecords::Parser &P = Recs.Lookup(pkgCache::DescFileIterator(Cache,J->Df));
+      pkgRecords::Parser &P = Recs.Lookup(pkgCache::DescFileIterator(*Cache,J->Df));
 
 
       if (J->NameMatch == false && NamesOnly == false)
       if (J->NameMatch == false && NamesOnly == false)
       {
       {
@@ -1398,15 +1428,17 @@ bool Search(CommandLine &CmdL)
 /* show automatically installed packages (sorted) */
 /* show automatically installed packages (sorted) */
 bool ShowAuto(CommandLine &CmdL)
 bool ShowAuto(CommandLine &CmdL)
 {
 {
-   OpProgress op;
-   pkgDepCache DepCache(GCache);
-   DepCache.Init(&op);
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   pkgDepCache *DepCache = CacheFile.GetDepCache();
+   if (unlikely(Cache == NULL || DepCache == NULL))
+      return false;
 
 
    std::vector<string> packages;
    std::vector<string> packages;
-   packages.reserve(GCache->HeaderP->PackageCount / 3);
+   packages.reserve(Cache->HeaderP->PackageCount / 3);
    
    
-   for (pkgCache::PkgIterator P = GCache->PkgBegin(); P.end() == false; P++)
-      if (DepCache[P].Flags & pkgCache::Flag::Auto)
+   for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; P++)
+      if ((*DepCache)[P].Flags & pkgCache::Flag::Auto)
          packages.push_back(P.Name());
          packages.push_back(P.Name());
 
 
     std::sort(packages.begin(), packages.end());
     std::sort(packages.begin(), packages.end());
@@ -1421,34 +1453,16 @@ bool ShowAuto(CommandLine &CmdL)
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* */
 /* */
 bool ShowPackage(CommandLine &CmdL)
 bool ShowPackage(CommandLine &CmdL)
-{   
-   pkgCache &Cache = *GCache;
-   pkgDepCache::Policy Plcy;
-
-   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
-   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
-   {
-      // Find the proper version to use.
-      if (_config->FindB("APT::Cache::AllVersions","true") == true)
-      {
-	 pkgCache::VerIterator V;
-	 for (V = Pkg.VersionList(); V.end() == false; V++)
-	 {
-	    if (DisplayRecord(V) == false)
-	       return false;
-	 }
-      }
-      else
-      {
-	 pkgCache::VerIterator V = Plcy.GetCandidateVer(Pkg);
-	 if (V.end() == true || V.FileList().end() == true)
-	    continue;
-	 if (DisplayRecord(V) == false)
-	    return false;
-      }      
-   }
-
-   if (pkgset.empty() == false)
+{
+   pkgCacheFile CacheFile;
+   APT::VersionSet::Version const select = _config->FindB("APT::Cache::AllVersions", true) ?
+			APT::VersionSet::ALL : APT::VersionSet::INSTALLED;
+   APT::VersionSet const verset = APT::VersionSet::FromCommandLine(CacheFile, CmdL.FileList, select);
+   for (APT::VersionSet::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver)
+      if (DisplayRecord(CacheFile, Ver) == false)
+	 return false;
+
+   if (verset.empty() == false)
         return true;
         return true;
    return _error->Error(_("No packages found"));
    return _error->Error(_("No packages found"));
 }
 }
@@ -1458,8 +1472,10 @@ bool ShowPackage(CommandLine &CmdL)
 /* This does a prefix match on the first argument */
 /* This does a prefix match on the first argument */
 bool ShowPkgNames(CommandLine &CmdL)
 bool ShowPkgNames(CommandLine &CmdL)
 {
 {
-   pkgCache &Cache = *GCache;
-   pkgCache::GrpIterator I = Cache.GrpBegin();
+   pkgCacheFile CacheFile;
+   if (unlikely(CacheFile.BuildCaches(NULL, false) == false))
+      return false;
+   pkgCache::GrpIterator I = CacheFile.GetPkgCache()->GrpBegin();
    bool const All = _config->FindB("APT::Cache::AllNames","false");
    bool const All = _config->FindB("APT::Cache::AllNames","false");
 
 
    if (CmdL.FileList[1] != 0)
    if (CmdL.FileList[1] != 0)
@@ -1495,11 +1511,13 @@ bool ShowPkgNames(CommandLine &CmdL)
 /* */
 /* */
 bool ShowSrcPackage(CommandLine &CmdL)
 bool ShowSrcPackage(CommandLine &CmdL)
 {
 {
-   pkgSourceList List;
-   List.ReadMainList();
-   
+   pkgCacheFile CacheFile;
+   pkgSourceList *List = CacheFile.GetSourceList();
+   if (unlikely(List == NULL))
+      return false;
+
    // Create the text record parsers
    // Create the text record parsers
-   pkgSrcRecords SrcRecs(List);
+   pkgSrcRecords SrcRecs(*List);
    if (_error->PendingError() == true)
    if (_error->PendingError() == true)
       return false;
       return false;
 
 
@@ -1530,19 +1548,18 @@ bool ShowSrcPackage(CommandLine &CmdL)
 /* */
 /* */
 bool Policy(CommandLine &CmdL)
 bool Policy(CommandLine &CmdL)
 {
 {
-   if (SrcList == 0)
-      return _error->Error("Generate must be enabled for this function");
-   
-   pkgCache &Cache = *GCache;
-   pkgPolicy Plcy(&Cache);
-   if (ReadPinFile(Plcy) == false || ReadPinDir(Plcy) == false)
+   pkgCacheFile CacheFile;
+   pkgCache *Cache = CacheFile.GetPkgCache();
+   pkgPolicy *Plcy = CacheFile.GetPolicy();
+   pkgSourceList *SrcList = CacheFile.GetSourceList();
+   if (unlikely(Cache == NULL || Plcy == NULL || SrcList == NULL))
       return false;
       return false;
-   
+
    // Print out all of the package files
    // Print out all of the package files
    if (CmdL.FileList[1] == 0)
    if (CmdL.FileList[1] == 0)
    {
    {
       cout << _("Package files:") << endl;   
       cout << _("Package files:") << endl;   
-      for (pkgCache::PkgFileIterator F = Cache.FileBegin(); F.end() == false; F++)
+      for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F.end() == false; F++)
       {
       {
 	 // Locate the associated index files so we can derive a description
 	 // Locate the associated index files so we can derive a description
 	 pkgIndexFile *Indx;
 	 pkgIndexFile *Indx;
@@ -1551,7 +1568,7 @@ bool Policy(CommandLine &CmdL)
 	    return _error->Error(_("Cache is out of sync, can't x-ref a package file"));
 	    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());
+		Plcy->GetPriority(F),Indx->Describe(true).c_str());
 	 
 	 
 	 // Print the reference information for the package
 	 // Print the reference information for the package
 	 string Str = F.RelStr();
 	 string Str = F.RelStr();
@@ -1563,16 +1580,16 @@ bool Policy(CommandLine &CmdL)
       
       
       // Show any packages have explicit pins
       // Show any packages have explicit pins
       cout << _("Pinned packages:") << endl;
       cout << _("Pinned packages:") << endl;
-      pkgCache::PkgIterator I = Cache.PkgBegin();
+      pkgCache::PkgIterator I = Cache->PkgBegin();
       for (;I.end() != true; I++)
       for (;I.end() != true; I++)
       {
       {
-	 if (Plcy.GetPriority(I) == 0)
+	 if (Plcy->GetPriority(I) == 0)
 	    continue;
 	    continue;
 
 
 	 // Print the package name and the version we are forcing to
 	 // Print the package name and the version we are forcing to
 	 cout << "     " << I.FullName(true) << " -> ";
 	 cout << "     " << I.FullName(true) << " -> ";
 	 
 	 
-	 pkgCache::VerIterator V = Plcy.GetMatch(I);
+	 pkgCache::VerIterator V = Plcy->GetMatch(I);
 	 if (V.end() == true)
 	 if (V.end() == true)
 	    cout << _("(not found)") << endl;
 	    cout << _("(not found)") << endl;
 	 else
 	 else
@@ -1593,7 +1610,7 @@ bool Policy(CommandLine &CmdL)
 		(InstalledLessCandidate > 0 ? (InstalledLessCandidate) : 0) - 1;
 		(InstalledLessCandidate > 0 ? (InstalledLessCandidate) : 0) - 1;
 
 
    // Print out detailed information for each package
    // Print out detailed information for each package
-   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList);
    for (APT::PackageSet::const_iterator I = pkgset.begin(); I != pkgset.end(); ++I)
    for (APT::PackageSet::const_iterator I = pkgset.begin(); I != pkgset.end(); ++I)
    {
    {
       pkgCache::PkgIterator Pkg = I.Group().FindPkg("any");
       pkgCache::PkgIterator Pkg = I.Group().FindPkg("any");
@@ -1613,17 +1630,17 @@ bool Policy(CommandLine &CmdL)
       
       
       // Candidate Version 
       // Candidate Version 
       cout << msgCandidate << OutputInDepth(deepCandidate, " ");
       cout << msgCandidate << OutputInDepth(deepCandidate, " ");
-      pkgCache::VerIterator V = Plcy.GetCandidateVer(Pkg);
+      pkgCache::VerIterator V = Plcy->GetCandidateVer(Pkg);
       if (V.end() == true)
       if (V.end() == true)
 	 cout << _("(none)") << endl;
 	 cout << _("(none)") << endl;
       else
       else
 	 cout << V.VerStr() << endl;
 	 cout << V.VerStr() << endl;
 
 
       // Pinned version
       // Pinned version
-      if (Plcy.GetPriority(Pkg) != 0)
+      if (Plcy->GetPriority(Pkg) != 0)
       {
       {
 	 cout << _("  Package pin: ");
 	 cout << _("  Package pin: ");
-	 V = Plcy.GetMatch(Pkg);
+	 V = Plcy->GetMatch(Pkg);
 	 if (V.end() == true)
 	 if (V.end() == true)
 	    cout << _("(not found)") << endl;
 	    cout << _("(not found)") << endl;
 	 else
 	 else
@@ -1638,7 +1655,7 @@ bool Policy(CommandLine &CmdL)
 	    cout << " *** " << V.VerStr();
 	    cout << " *** " << V.VerStr();
 	 else
 	 else
 	    cout << "     " << V.VerStr();
 	    cout << "     " << V.VerStr();
-	 cout << " " << Plcy.GetPriority(Pkg) << endl;
+	 cout << " " << Plcy->GetPriority(Pkg) << endl;
 	 for (pkgCache::VerFileIterator VF = V.FileList(); VF.end() == false; VF++)
 	 for (pkgCache::VerFileIterator VF = V.FileList(); VF.end() == false; VF++)
 	 {
 	 {
 	    // Locate the associated index files so we can derive a description
 	    // Locate the associated index files so we can derive a description
@@ -1646,7 +1663,7 @@ bool Policy(CommandLine &CmdL)
 	    if (SrcList->FindIndex(VF.File(),Indx) == false &&
 	    if (SrcList->FindIndex(VF.File(),Indx) == false &&
 		_system->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"));
 	       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());
 		   Indx->Describe(true).c_str());
 	 }
 	 }
       }
       }
@@ -1661,12 +1678,11 @@ bool Policy(CommandLine &CmdL)
 /* */
 /* */
 bool Madison(CommandLine &CmdL)
 bool Madison(CommandLine &CmdL)
 {
 {
-   if (SrcList == 0)
-      return _error->Error("Generate must be enabled for this function");
-
-   SrcList->ReadMainList();
+   pkgCacheFile CacheFile;
+   pkgSourceList *SrcList = CacheFile.GetSourceList();
 
 
-   pkgCache &Cache = *GCache;
+   if (SrcList == 0)
+      return false;
 
 
    // Create the src text record parsers and ignore errors about missing
    // Create the src text record parsers and ignore errors about missing
    // deb-src lines that are generated from pkgSrcRecords::pkgSrcRecords
    // deb-src lines that are generated from pkgSrcRecords::pkgSrcRecords
@@ -1674,7 +1690,7 @@ bool Madison(CommandLine &CmdL)
    if (_error->PendingError() == true)
    if (_error->PendingError() == true)
       _error->Discard();
       _error->Discard();
 
 
-   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList);
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
    {
       if (Pkg.end() == false)
       if (Pkg.end() == false)
@@ -1729,11 +1745,9 @@ bool Madison(CommandLine &CmdL)
 bool GenCaches(CommandLine &Cmd)
 bool GenCaches(CommandLine &Cmd)
 {
 {
    OpTextProgress Progress(*_config);
    OpTextProgress Progress(*_config);
-   
-   pkgSourceList List;
-   if (List.ReadMainList() == false)
-      return false;   
-   return pkgMakeStatusCache(List,Progress);
+
+   pkgCacheFile CacheFile;
+   return CacheFile.BuildCaches(&Progress, true);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // ShowHelp - Show a help screen					/*{{{*/
 // ShowHelp - Show a help screen					/*{{{*/
@@ -1865,35 +1879,10 @@ int main(int argc,const char *argv[])					/*{{{*/
    if (isatty(STDOUT_FILENO) && _config->FindI("quiet",0) < 1)
    if (isatty(STDOUT_FILENO) && _config->FindI("quiet",0) < 1)
       _config->Set("quiet","1");
       _config->Set("quiet","1");
 
 
+//       if (_config->FindB("APT::Cache::Generate",true) == false)
    if (CmdL.DispatchArg(CmdsA,false) == false && _error->PendingError() == false)
    if (CmdL.DispatchArg(CmdsA,false) == false && _error->PendingError() == false)
-   { 
-      MMap *Map = 0;
-      if (_config->FindB("APT::Cache::Generate",true) == false)
-      {
-	 Map = new MMap(*new FileFd(_config->FindFile("Dir::Cache::pkgcache"),
-				    FileFd::ReadOnly),MMap::Public|MMap::ReadOnly);
-      }
-      else
-      {
-	 // Open the cache file
-	 SrcList = new pkgSourceList;
-	 SrcList->ReadMainList();
+      CmdL.DispatchArg(CmdsB);
 
 
-	 // Generate it and map it
-	 OpProgress Prog;
-	 pkgMakeStatusCache(*SrcList,Prog,&Map,true);
-      }
-      
-      if (_error->PendingError() == false)
-      {
-	 pkgCache Cache(Map);   
-	 GCache = &Cache;
-	 if (_error->PendingError() == false)
-	    CmdL.DispatchArg(CmdsB);
-      }
-      delete Map;
-   }
-   
    // Print any errors or warnings found during parsing
    // Print any errors or warnings found during parsing
    if (_error->empty() == false)
    if (_error->empty() == false)
    {
    {

+ 1 - 0
debian/changelog

@@ -32,6 +32,7 @@ apt (0.7.26~exp6) UNRELEASED; urgency=low
     - get the best matching arch package from a group with FindPreferredPkg
     - get the best matching arch package from a group with FindPreferredPkg
   * cmdline/apt-cache.cc:
   * cmdline/apt-cache.cc:
     - make the search multiarch compatible by using GrpIterator instead
     - make the search multiarch compatible by using GrpIterator instead
+    - use pkgCacheFile and the new CacheSets all over the place
   * apt-pkg/cachefile.{cc,h}:
   * apt-pkg/cachefile.{cc,h}:
     - split Open() into submethods to be able to build only parts
     - split Open() into submethods to be able to build only parts
     - make the OpProgress optional in the Cache buildprocess
     - make the OpProgress optional in the Cache buildprocess