]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/pkgcachegen.cc
Minor cleanups, fix for checksum lowercase bug
[apt.git] / apt-pkg / pkgcachegen.cc
index ee65c94d1c707ed5b7b1893a953921533dcc0361..0a645ca7e02a3c53152f8239e2ba407216e7e33b 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcachegen.cc,v 1.35 1999/04/18 06:36:36 jgg Exp $
+// $Id: pkgcachegen.cc,v 1.41 1999/07/26 17:46:07 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
 
 #include <sys/stat.h>
 #include <unistd.h>
+#include <errno.h>
                                                                        /*}}}*/
 
 // CacheGenerator::pkgCacheGenerator - Constructor                     /*{{{*/
 // ---------------------------------------------------------------------
 /* We set the diry flag and make sure that is written to the disk */
 pkgCacheGenerator::pkgCacheGenerator(DynamicMMap &Map,OpProgress &Prog) :
-                    Map(Map), Cache(Map), Progress(Prog)
+                    Map(Map), Cache(Map), Progress(&Prog)
 {
+   CurrentFile = 0;
+   
    if (_error->PendingError() == true)
       return;
    
@@ -67,7 +70,8 @@ pkgCacheGenerator::~pkgCacheGenerator()
 // ---------------------------------------------------------------------
 /* This provides the generation of the entries in the cache. Each loop
    goes through a single package record from the underlying parse engine. */
-bool pkgCacheGenerator::MergeList(ListParser &List)
+bool pkgCacheGenerator::MergeList(ListParser &List,
+                                 pkgCache::VerIterator *OutVer)
 {
    List.Owner = this;
 
@@ -83,8 +87,8 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
       if (NewPackage(Pkg,PackageName) == false)
         return _error->Error("Error occured while processing %s (NewPackage)",PackageName.c_str());
       Counter++;
-      if (Counter % 100 == 0)
-        Progress.Progress(List.Offset());
+      if (Counter % 100 == 0 && Progress != 0)
+        Progress->Progress(List.Offset());
 
       /* Get a pointer to the version structure. We know the list is sorted
          so we use that fact in the search. Insertion of new versions is
@@ -98,7 +102,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
       }
 
       pkgCache::VerIterator Ver = Pkg.VersionList();
-      __apt_ptrloc *Last = &Pkg->VersionList;
+      map_ptrloc *Last = &Pkg->VersionList;
       int Res = 1;
       for (; Ver.end() == false; Last = &Ver->NextVer, Ver++)
       {
@@ -110,20 +114,41 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
       
       /* We already have a version for this item, record that we
          saw it */
-      if (Res == 0)
+      unsigned long Hash = List.VersionHash();
+      if (Res == 0 && Ver->Hash == Hash)
       {
         if (List.UsePackage(Pkg,Ver) == false)
            return _error->Error("Error occured while processing %s (UsePackage2)",PackageName.c_str());
-        
+
         if (NewFileVer(Ver,List) == false)
            return _error->Error("Error occured while processing %s (NewFileVer1)",PackageName.c_str());
         
+        // Read only a single record and return
+        if (OutVer != 0)
+        {
+           *OutVer = Ver;
+           return true;
+        }
+        
         continue;
       }      
 
+      // Skip to the end of the same version set.
+      if (Res == 0)
+      {
+        for (; Ver.end() == false; Last = &Ver->NextVer, Ver++)
+        {
+           Res = pkgVersionCompare(Version.begin(),Version.end(),Ver.VerStr(),
+                                   Ver.VerStr() + strlen(Ver.VerStr()));
+           if (Res != 0)
+              break;
+        }
+      }
+
       // Add a new version
       *Last = NewVersion(Ver,Version,*Last);
       Ver->ParentPkg = Pkg.Index();
+      Ver->Hash = Hash;
       if (List.NewVersion(Ver) == false)
         return _error->Error("Error occured while processing %s (NewVersion1)",PackageName.c_str());
 
@@ -132,6 +157,13 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
       
       if (NewFileVer(Ver,List) == false)
         return _error->Error("Error occured while processing %s (NewVersion2)",PackageName.c_str());
+
+      // Read only a single record and return
+      if (OutVer != 0)
+      {
+        *OutVer = Ver;
+        return true;
+      }      
    }
 
    return true;
@@ -173,6 +205,9 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,string Name)
 bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
                                   ListParser &List)
 {
+   if (CurrentFile == 0)
+      return true;
+   
    // Get a structure
    unsigned long VerFile = Map.Allocate(sizeof(pkgCache::VerFile));
    if (VerFile == 0)
@@ -182,7 +217,7 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
    VF->File = CurrentFile - Cache.PkgFileP;
    
    // Link it to the end of the list
-   __apt_ptrloc *Last = &Ver->FileList;
+   map_ptrloc *Last = &Ver->FileList;
    for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; V++)
       Last = &V->NextFile;
    VF->NextFile = *Last;
@@ -351,7 +386,8 @@ bool pkgCacheGenerator::SelectFile(string File,unsigned long Flags)
    if (CurrentFile->FileName == 0)
       return false;
    
-   Progress.SubProgress(Buf.st_size);
+   if (Progress != 0)
+      Progress->SubProgress(Buf.st_size);
    return true;
 }
                                                                        /*}}}*/
@@ -372,7 +408,7 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S,
    // Search for an insertion point
    pkgCache::StringItem *I = Cache.StringItemP + Cache.HeaderP->StringList;
    int Res = 1;
-   __apt_ptrloc *Last = &Cache.HeaderP->StringList;
+   map_ptrloc *Last = &Cache.HeaderP->StringList;
    for (; I != Cache.StringItemP; Last = &I->NextItem, 
         I = Cache.StringItemP + I->NextItem)
    {
@@ -557,10 +593,10 @@ bool pkgPkgCacheCheck(string CacheFile)
    return true;
 }
                                                                        /*}}}*/
-// AddSourcesSize - Add the size of the status files                   /*{{{*/
+// AddStatusSize - Add the size of the status files                    /*{{{*/
 // ---------------------------------------------------------------------
 /* This adds the size of all the status files to the size counter */
-static bool pkgAddSourcesSize(unsigned long &TotalSize)
+bool pkgAddStatusSize(unsigned long &TotalSize)
 {
    // Grab the file names
    string xstatus = _config->FindFile("Dir::State::xstatus");
@@ -583,8 +619,8 @@ static bool pkgAddSourcesSize(unsigned long &TotalSize)
 // MergeStatus - Add the status files to the cache                     /*{{{*/
 // ---------------------------------------------------------------------
 /* This adds the status files to the map */
-static bool pkgMergeStatus(OpProgress &Progress,pkgCacheGenerator &Gen,
-                          unsigned long &CurrentSize,unsigned long TotalSize)
+bool pkgMergeStatus(OpProgress &Progress,pkgCacheGenerator &Gen,
+                   unsigned long &CurrentSize,unsigned long TotalSize)
 {
    // Grab the file names   
    string Status[3];
@@ -623,7 +659,7 @@ static bool pkgMergeStatus(OpProgress &Progress,pkgCacheGenerator &Gen,
 /* This puts the source package cache into the given generator. */
 bool pkgGenerateSrcCache(pkgSourceList &List,OpProgress &Progress,
                         pkgCacheGenerator &Gen,
-                        unsigned long &CurrentSize,unsigned long TotalSize)
+                        unsigned long &CurrentSize,unsigned long &TotalSize)
 {
    string ListDir = _config->FindDir("Dir::State::lists");
    
@@ -638,7 +674,7 @@ bool pkgGenerateSrcCache(pkgSourceList &List,OpProgress &Progress,
       TotalSize += Buf.st_size;
    }
    
-   if (pkgAddSourcesSize(TotalSize) == false)
+   if (pkgAddStatusSize(TotalSize) == false)
       return false;
    
    // Generate the pkg source cache
@@ -744,7 +780,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress)
    
    // Compute the progress
    unsigned long TotalSize = 0;
-   if (pkgAddSourcesSize(TotalSize) == false)
+   if (pkgAddStatusSize(TotalSize) == false)
       return false;
 
    unsigned long CurrentSize = 0;
@@ -761,7 +797,9 @@ MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
    /* If the cache file is writeable this is just a wrapper for
       MakeStatusCache */
    string CacheFile = _config->FindFile("Dir::Cache::pkgcache");
-   bool Writeable = access(CacheFile.c_str(),W_OK) == 0;
+   bool Writeable = (access(CacheFile.c_str(),W_OK) == 0) ||
+                    (errno == ENOENT);
+
    if (Writeable == true)
    {
       if (pkgMakeStatusCache(List,Progress) == false)
@@ -856,7 +894,7 @@ MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
    
    // Compute the progress
    unsigned long TotalSize = 0;
-   if (pkgAddSourcesSize(TotalSize) == false)
+   if (pkgAddStatusSize(TotalSize) == false)
    {
       delete Map;
       return 0;