+bool pkgCacheFile::AddIndexFile(pkgIndexFile * const File) /*{{{*/
+{
+ if (SrcList == NULL)
+ if (BuildSourceList() == false)
+ return false;
+ SrcList->AddVolatileFile(File);
+
+ if (Cache == nullptr || File->HasPackages() == false || File->Exists() == false)
+ return true;
+
+ if (File->FindInCache(*Cache).end() == false)
+ return _error->Warning("Duplicate sources.list entry %s",
+ File->Describe().c_str());
+
+ if (ExternOwner == false)
+ {
+ delete DCache;
+ delete Cache;
+ }
+ delete Policy;
+ DCache = NULL;
+ Policy = NULL;
+ Cache = NULL;
+
+ if (ExternOwner == false)
+ {
+ // a dynamic mmap means that we have build at least parts of the cache
+ // in memory – which we might or might not have written to disk.
+ // Throwing away would therefore be a very costly operation we want to avoid
+ DynamicMMap * dynmmap = dynamic_cast<DynamicMMap*>(Map);
+ if (dynmmap != nullptr)
+ {
+ {
+ pkgCacheGenerator Gen(dynmmap, nullptr);
+ if (Gen.Start() == false || File->Merge(Gen, nullptr) == false)
+ return false;
+ }
+ Cache = new pkgCache(Map);
+ if (_error->PendingError() == true) {
+ delete Cache;
+ Cache = nullptr;
+ return false;
+ }
+ return true;
+ }
+ else
+ {
+ delete Map;
+ Map = NULL;
+ }
+ }
+ else
+ {
+ ExternOwner = false;
+ Map = NULL;
+ }
+ _system->UnLock(true);
+ return true;
+}
+ /*}}}*/