+// CacheFile::BuildCaches - Open and build the cache files /*{{{*/
+class APT_HIDDEN ScopedErrorMerge {
+public:
+ ScopedErrorMerge() { _error->PushToStack(); }
+ ~ScopedErrorMerge() { _error->MergeWithStack(); }
+};
+bool pkgCacheFile::BuildCaches(OpProgress *Progress, bool WithLock)
+{
+ if (Cache != NULL)
+ return true;
+
+ ScopedErrorMerge sem;
+ if (_config->FindB("pkgCacheFile::Generate", true) == false)
+ {
+ FileFd file(_config->FindFile("Dir::Cache::pkgcache"), FileFd::ReadOnly);
+ if (file.IsOpen() == false || file.Failed())
+ return false;
+ Map = new MMap(file, MMap::Public|MMap::ReadOnly);
+ if (unlikely(Map->validData() == false))
+ return false;
+ Cache = new pkgCache(Map);
+ return _error->PendingError() == false;
+ }
+
+ if (WithLock == true)
+ if (_system->Lock() == false)
+ return false;
+
+ if (_error->PendingError() == true)
+ return false;
+
+ BuildSourceList(Progress);
+
+ // Read the caches
+ bool Res = pkgCacheGenerator::MakeStatusCache(*SrcList,Progress,&Map, true);
+ if (Progress != NULL)
+ Progress->Done();
+ if (Res == false)
+ return _error->Error(_("The package lists or status file could not be parsed or opened."));
+
+ /* This sux, remove it someday */
+ if (_error->PendingError() == true)
+ _error->Warning(_("You may want to run apt-get update to correct these problems"));
+
+ Cache = new pkgCache(Map);
+ if (_error->PendingError() == true)
+ return false;
+ return true;
+}
+ /*}}}*/
+// CacheFile::BuildSourceList - Open and build all relevant sources.list/*{{{*/