]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/pkgcachegen.cc
This is realloc, not reallocf: be more careful :/.
[apt.git] / apt-pkg / pkgcachegen.cc
index 107f1f1413b16763fe530a703e67ca70b3cc248a..8ee682db83f38a7e2e9cee8f8a43047d6bbef095 100644 (file)
@@ -70,7 +70,7 @@ bool pkgCacheGenerator::Start()
       bool const newError = _error->PendingError();
       _error->MergeWithStack();
       if (newError)
-        return false;
+        return _error->ReturnError();
       if (Map.Size() <= 0)
         return false;
 
@@ -134,7 +134,7 @@ bool pkgCacheGenerator::Start()
    advoid a problem during a crash */
 pkgCacheGenerator::~pkgCacheGenerator()
 {
-   if (_error->PendingError() == true || Map.validData() == false)
+   if (Map.validData() == false)
       return;
    if (Map.Sync() == false)
       return;
@@ -250,7 +250,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
    {
       string const PackageName = List.Package();
       if (PackageName.empty() == true)
-        return false;
+          continue;
 
       Counter++;
       if (Counter % 100 == 0 && Progress != 0)
@@ -264,24 +264,26 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
       {
         // package descriptions
         if (MergeListGroup(List, PackageName) == false)
-           return false;
+           continue;
         continue;
       }
 
       // Get a pointer to the package structure
       pkgCache::PkgIterator Pkg;
       Dynamic<pkgCache::PkgIterator> DynPkg(Pkg);
-      if (NewPackage(Pkg, PackageName, Arch) == false)
+      if (NewPackage(Pkg, PackageName, Arch) == false) {
         // TRANSLATOR: The first placeholder is a package name,
         // the other two should be copied verbatim as they include debug info
-        return _error->Error(_("Error occurred while processing %s (%s%d)"),
+        _error->Error(_("Error occurred while processing %s (%s%d)"),
                              PackageName.c_str(), "NewPackage", 1);
+         continue;
+      }
 
 
       if (Version.empty() == true)
       {
         if (MergeListPackage(List, Pkg) == false)
-           return false;
+           continue;
       }
       else
       {
@@ -1271,6 +1273,36 @@ bool pkgCacheGenerator::SelectReleaseFile(const string &File,const string &Site,
    Cache.HeaderP->RlsFileList = CurrentRlsFile - Cache.RlsFileP;
    Cache.HeaderP->ReleaseFileCount++;
 
+   return true;
+}
+                                                                       /*}}}*/
+// ListParser::NewTag - Create a Tag element                           /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgCacheListParser::NewTag(pkgCache::VerIterator &Ver,
+                                          const char *NameStart,
+                                          unsigned int NameSize)
+{
+   return Owner->NewTag(Ver, NameStart, NameSize);
+}
+bool pkgCacheGenerator::NewTag(pkgCache::VerIterator &Ver,
+                                          const char *NameStart,
+                                          unsigned int NameSize)
+{
+   // Get a structure
+   unsigned long Tagg = AllocateInMap(sizeof(pkgCache::Tag));
+   if (Tagg == 0)
+      return false;
+   Cache.HeaderP->TagCount++;
+   
+   // Fill it in
+   pkgCache::TagIterator Tg(Cache,Cache.TagP + Tagg);
+   Tg->Name = WriteStringInMap(NameStart,NameSize);
+   if (Tg->Name == 0)
+      return false;
+   Tg->NextTag = Ver->TagList;
+   Ver->TagList = Tg.Index();
+   
    return true;
 }
                                                                        /*}}}*/
@@ -1398,7 +1430,7 @@ static bool CheckValidity(const string &CacheFile,
    {
       if (Debug == true)
         std::clog << "Errors are pending or Map is empty() for " << CacheFile << std::endl;
-      return false;
+      return _error->ReturnError();
    }
 
    std::unique_ptr<bool[]> RlsVisited(new bool[Cache.HeaderP->ReleaseFileCount]);
@@ -1478,7 +1510,7 @@ static bool CheckValidity(const string &CacheFile,
         std::clog << "Validity failed because of pending errors:" << std::endl;
         _error->DumpErrors(std::clog, GlobalError::DEBUG, false);
       }
-      return false;
+      return _error->ReturnError();
    }
 
    if (OutMap != 0)
@@ -1516,16 +1548,14 @@ static map_filesize_t ComputeSize(pkgSourceList const * const List, FileIterator
 }
                                                                        /*}}}*/
 // BuildCache - Merge the list of index files into the cache           /*{{{*/
-static bool BuildCache(pkgCacheGenerator &Gen,
+static void BuildCache(pkgCacheGenerator &Gen,
                       OpProgress * const Progress,
                       map_filesize_t &CurrentSize,map_filesize_t TotalSize,
                       pkgSourceList const * const List,
                       FileIterator const Start, FileIterator const End)
 {
-   bool mergeFailure = false;
-
    auto const indexFileMerge = [&](pkgIndexFile * const I) {
-      if (I->HasPackages() == false || mergeFailure)
+      if (I->HasPackages() == false)
         return;
 
       if (I->Exists() == false)
@@ -1543,8 +1573,10 @@ static bool BuildCache(pkgCacheGenerator &Gen,
         Progress->OverallProgress(CurrentSize, TotalSize, Size, _("Reading package lists"));
       CurrentSize += Size;
 
-      if (I->Merge(Gen,Progress) == false)
-        mergeFailure = true;
+      if (I->Merge(Gen,Progress) == false) {
+        _error->ReturnError();
+        return;
+      }
    };
 
    if (List !=  NULL)
@@ -1558,14 +1590,14 @@ static bool BuildCache(pkgCacheGenerator &Gen,
            continue;
         }
 
-        if ((*i)->Merge(Gen, Progress) == false)
-           return false;
+        if ((*i)->Merge(Gen, Progress) == false) {
+           _error->ReturnError();
+           continue;
+        }
 
         std::vector <pkgIndexFile *> *Indexes = (*i)->GetIndexFiles();
         if (Indexes != NULL)
            std::for_each(Indexes->begin(), Indexes->end(), indexFileMerge);
-        if (mergeFailure)
-           return false;
       }
    }
 
@@ -1573,10 +1605,7 @@ static bool BuildCache(pkgCacheGenerator &Gen,
    {
       Gen.SelectReleaseFile("", "");
       std::for_each(Start, End, indexFileMerge);
-      if (mergeFailure)
-        return false;
    }
-   return true;
 }
                                                                        /*}}}*/
 // CacheGenerator::MakeStatusCache - Construct the status cache                /*{{{*/
@@ -1636,7 +1665,7 @@ static bool loadBackMMapFromFile(std::unique_ptr<pkgCacheGenerator> &Gen,
    bool const newError = _error->PendingError();
    _error->MergeWithStack();
    if (alloc == 0 && newError)
-      return false;
+      return _error->ReturnError();
    if (CacheF.Read((unsigned char *)Map->Data() + alloc, CacheF.Size()) == false)
       return false;
    Gen.reset(new pkgCacheGenerator(Map.get(),Progress));
@@ -1750,9 +1779,8 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
         return false;
 
       TotalSize += ComputeSize(&List, Files.begin(),Files.end());
-      if (BuildCache(*Gen, Progress, CurrentSize, TotalSize, &List,
-              Files.end(),Files.end()) == false)
-        return false;
+      BuildCache(*Gen, Progress, CurrentSize, TotalSize, &List,
+              Files.end(),Files.end());
 
       if (Writeable == true && SrcCacheFile.empty() == false)
         if (writeBackMMapToFile(Gen.get(), Map.get(), SrcCacheFile) == false)
@@ -1763,9 +1791,8 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
    {
       if (Debug == true)
         std::clog << "Building status cache in pkgcache.bin now" << std::endl;
-      if (BuildCache(*Gen, Progress, CurrentSize, TotalSize, NULL,
-              Files.begin(), Files.end()) == false)
-        return false;
+      BuildCache(*Gen, Progress, CurrentSize, TotalSize, NULL,
+              Files.begin(), Files.end());
 
       if (Writeable == true && CacheFile.empty() == false)
         if (writeBackMMapToFile(Gen.get(), Map.get(), CacheFile) == false)
@@ -1786,9 +1813,8 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
       }
 
       Files = List.GetVolatileFiles();
-      if (BuildCache(*Gen, Progress, CurrentSize, TotalSize, NULL,
-              Files.begin(), Files.end()) == false)
-        return false;
+      BuildCache(*Gen, Progress, CurrentSize, TotalSize, NULL,
+              Files.begin(), Files.end());
    }
 
    if (OutMap != nullptr)
@@ -1825,14 +1851,15 @@ bool pkgCacheGenerator::MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **O
    if (Progress != NULL)
       Progress->OverallProgress(0,1,1,_("Reading package lists"));
    pkgCacheGenerator Gen(Map.get(),Progress);
-   if (Gen.Start() == false || _error->PendingError() == true)
-      return false;
-   if (BuildCache(Gen,Progress,CurrentSize,TotalSize, NULL,
-                 Files.begin(), Files.end()) == false)
+   if (Gen.Start() == false)
       return false;
-
    if (_error->PendingError() == true)
-      return false;
+      return _error->ReturnError();
+   BuildCache(Gen,Progress,CurrentSize,TotalSize, NULL,
+                 Files.begin(), Files.end());
+   // We've passed the point of no return
+   _error->ReturnError();
+
    *OutMap = Map.release();
    
    return true;